reactive programming 1.2   Recap- Functions and Pattern Matching

  1. 用scala 表示JSON数据
package week1

abstract class JSON 
case class JObj(bindings: Map[String, JSON]) extends JSON 
case class JSeq(elems: List[JSON]) extends JSON
case class JNum(num: Double) extends JSON
case class JStr(str: String) extends JSON
case class JBool(b: Boolean) extends JSON
case object JNull extends JSON

将JSON对象显示为JSON串

package week1

object Main extends App {

  val data = JObj(Map(
    "firstName" -> JStr("John"),
    "lastName" -> JStr("Smith"),
    "address" -> JObj(Map(
      "streetAddress" -> JStr("21 2nd Street"),
      "state" -> JStr("NY"),
      "postalCode" -> JNum(10021))),
    "phoneNumbers" -> JSeq(List(
      JObj(Map(
        "type" -> JStr("home"), "number" -> JStr("212 555-1234"))),
      JObj(Map(
        "type" -> JStr("fax"), "number" -> JStr("646 555-4567")))))))

  def show(json: JSON): String = json match {
    case JNum(num) => num.toString
    case JBool(b) => b.toString
    case JNull => "null"
    case JStr(str) => ‘\"‘ + str + ‘\"‘
    case JSeq(elems) => "[" + (elems map show mkString ",") + "]"
    case JObj(bindings) => 
      val assoc = bindings map {
        case (key, value) => "\""+key+"\""+":"+"\""+show(value)+"\""
      }
      "{"+ ( assoc mkString ",") + "}"
  }
  println(show(data))
}

2. case 序列作为函数:

  val f:String => String = {case "ping" => "pong"}//> f  : String => String = <function1>
  f("ping")                                       //> res0: String = pong
  // f的定义等价于
  val ff = new Function1[String, String] {
     def apply(s: String) = s match {
       case "ping" => "pong"
     }
  }                                               //> ff  : String => String = <function1>

但是f有可能抛mactch error

package week1

object Test {
  val f:String => String = {case "ping" => "pong"}//> f  : String => String = <function1>
  f("ping")                                       //> res0: String = pong
  f("pong")                                       //> scala.MatchError: pong (of class java.lang.String)
                                                  //| 	at week1.Test$$anonfun$main$1$$anonfun$1.apply(week1.Test.scala:4)
                                                  //| 	at week1.Test$$anonfun$main$1$$anonfun$1.apply(week1.Test.scala:4)
                                                  //| 	at week1.Test$$anonfun$main$1.apply$mcV$sp(week1.Test.scala:6)
                                                  //| 	at org.scalaide.worksheet.runtime.library.WorksheetSupport$$anonfun$$exe
                                                  //| cute$1.apply$mcV$sp(WorksheetSupport.scala:76)
                                                  //| 	at org.scalaide.worksheet.runtime.library.WorksheetSupport$.redirected(W
                                                  //| orksheetSupport.scala:65)
                                                  //| 	at org.scalaide.worksheet.runtime.library.WorksheetSupport$.$execute(Wor
                                                  //| ksheetSupport.scala:75)
                                                  //| 	at week1.Test$.main(week1.Test.scala:3)
                                                  //| 	at week1.Test.main(week1.Test.scala)
}

这时可以用偏函数,在调用前检查一下在参数处是否有定义

package week1

object Test {
  val f:PartialFunction[String, String] = {case "ping" => "pong"}
                                                  //> f  : PartialFunction[String,String] = <function1>
  f.isDefinedAt("ping")                           //> res0: Boolean = true
  f.isDefinedAt("pong")                           //> res1: Boolean = false
}

3.但是检查isDefinedAt并不能保证不抛MatchError

  val g: PartialFunction[List[Int], String] = {
    case Nil => "one"
    case x :: rest =>
      rest match {
        case Nil => "two"
      }
  }
  g.isDefinedAt(List(1, 2, 3))  //true
时间: 2024-10-09 21:37:20

reactive programming 1.2   Recap- Functions and Pattern Matching的相关文章

&quot;reactive programming&quot;的概念

下面的内容大多是翻译来的. Reactive Programming? What is Reactive Programming? 为了了解Reactive——从编程范式至其背后的动机,有必要了解现在的开发者和公司在十年前不曾面对的挑战. 游戏的改变主要有两大方面: 硬件的提升 因特网 Why things are different now? (原文对比了一遍2005年和2014年因特用户的增长:10亿至29.5亿:Facebook用户的增长:550万至13亿: twitter从无至有,0至2

Unity基于响应式编程(Reactive programming)入门

系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率 背景 前有慕容小匹夫的一篇<解构C#游戏框架uFrame兼谈游戏架构设计&

[RxJS] Reactive Programming - What is RxJS?

First thing need to understand is, Reactive programming is dealing with the event stream. Event streams happens overtime, which not stay in the memory. For example, the array we have: var source = ['1', '1', 'foo', '2', '3', '5', 'bar', '8', '13']; W

[Reactive Programming] RxJS dynamic behavior

This lesson helps you think in Reactive programming by explaining why it is a beneficial paradigm for programming. See how reactive programming helps you understand the dynamic behavior of a value evolving over time. It allows you to specify the dyna

Functional reactive programming introduction using ReactiveCocoa中文版

今天发现了Functional reactive programming introduction using ReactiveCocoa - By AshFurrow的中文翻译版,译者为: kevinHM,以下为github地址: https://github.com/KevinHM/FunctionalReactiveProgrammingOniOS 感谢原作者和译者的贡献!

&quot;Principles of Reactive Programming&quot; 之&lt;Actors are Distributed&gt; (1)

week7中的前两节课的标题是”Actors are Distributed",讲了很多Akka Cluster的内容,同时也很难理解. Roland Kuhn并没有讲太多Akka Cluster自身如何工作的细节,而是更关注于如何利用Akka Cluster来把Actor分布到不同的节点上,或许这么安排是因为Akka Cluster能讲的东西太多,而Coursera的课时不够.但是,从听众的角度来说,这节课只是初步明白了下Akka Cluster能干啥,但是想要自己用起来,特别是想了解其工作的

响应式编程(Reactive programming)

响应式编程是指确保程序对事件或输入做出响应的做法.在这一节,我们将专注于图形界面方面的响应式编程,图形界面总量响应式的.然而,其他网格的编程也需要考虑响应式编程,例如,运行在服务器上的程序总是需要保持对输入作出响应,即使是在它处理其他需要长时间运行的任务期间.我们将在第十一章实现聊天服务器时,会看到在服务器编程方面也要用到这里讨论的一些方法. 大多数图形界面库使用事件循环去处理绘制图形界面,以及与用户之间的交互,就是说,一个线程既要负责绘制图形界面,也要处理其上的所有事件,我们称这种线程为图形界

ReactiveCocoa与Functional Reactive Programming

什么是Functional Reactive Programming http://limboy.me/ios/2013/06/19/frp-reactivecocoa.html Functional Reactive Programming(以下简称FRP)是一种响应变化的编程范式.先来看一小段代码 a = 2 b = 2 c = a + b // c is 4 b = 3 // now what is the value of c? 如果使用FRP,c的值将会随着b的值改变而改变,所以叫做「

reactive programming

In computing, reactive programming is a declarative programming paradigm concerned with data streams and the propagation of change. programming around data flows an he propagation of change. 原文地址:https://www.cnblogs.com/feng9exe/p/8613384.html

Net中的反应式编程(Reactive Programming)

目录 系列主题:基于消息的软件架构模型演变 系列主题:基于消息的软件架构模型演变 一.反应式编程(Reactive Programming) 1.什么是反应式编程:反应式编程(Reactive programming)简称Rx,他是一个使用LINQ风格编写基于观察者模式的异步编程模型.简单点说Rx = Observables + LINQ + Schedulers. 2.为什么会产生这种风格的编程模型?我在本系列文章开始的时候说过一个使用事件的例子: 1 2 3 4 5 6 7 8 9 var