Scala的模式匹配本质是什么? -从Coursera的响应式编程说起

推荐Coursera上的响应式编程课程,这个课程是scala语言的进阶课程。

课程的开始提出了这样一个应用场景:构建Json串,不知道Json的同学随便google一下。

为了做到这些事情,我们定义了下面的一些类

abstract class JSON

case class JSeq(elems: List[JSON]) extends JSON 

case class JObj(bindings: Map[String, 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对象

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("211 555-1234")
      )),
      JObj(Map(
        "type" -> JStr("fax"), "number" -> JStr("646 555-4567")
      ))
    ))
  ))

  

然后把Json显示出来

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

,结果如下:

{
    "firstName": "John",
    "lastName": "Smith",
    "address": {
        "streetAddress": "21 2nd street",
        "state": "NY",
        "postalCode": 10021
    },
    "phoneNumbers": [
        {
            "type": "home",
            "number": "211 555-1234"
        },
        {
            "type": "fax",
            "number": "646 555-4567"
        }
    ]
}

需要值得我们深思的是这一段:

{ case (key, value) => "\"" + key + "\": " + show(value) }

{case (key, value) =>  "\"" + key + "\": " + show(value)} 到底是什么类型?  这段代码是怎么跟前面的map结合起来的?

这段代码本身,不是一个类型。

打开map函数的定义,看到的是map[B, That](f: A => B),意思是,输入时A,给出B。

对于上面的map,它期望得到的输入应当是JBinding(我们定义type JBinding = (String, JSON)),输出String;也就是JBinding => String

我们再看看=>这个符号,这其实就是一个函数的表示  A=>B就是一个函数。其实这样A=》B的格式是scala的Function1的简写。那么上面的JBinding => String,就是scala.Function1[JBinding, String]

继续看trait Function1的定义(apply方法,天堂的入口)。

trait Function1[-A, +R] {

  def apply(x: A): R

}

在做模式匹配的过程中,{ case (key, value) => "\"" + key + "\": " + show(value) } 被翻译成

new Function1[JBinding, String] {

  def apply(x: JBinding) = x match {

    case (key, value) => key + ";" + show(value)

  }

}

然后大家都能看懂了吧?

最后总结一下: scala的语法中,所有模式匹配最后都归结到apply方法的匹配,然后一切又可以按照固有的思维去看。

Scala的模式匹配本质是什么? -从Coursera的响应式编程说起

时间: 2024-11-14 22:33:39

Scala的模式匹配本质是什么? -从Coursera的响应式编程说起的相关文章

Scala之模式匹配(Patterns Matching)

前言 首先,我们要在一开始强调一件很重要的事:Scala的模式匹配发生在但绝不仅限于发生在match case语句块中,这是Scala模式匹配之所以重要且有用的一个关键因素!我们会在文章的后半部分详细地讨论这一点. 模式匹配的种类 在Scala中一共有如下几种类型的模式匹配: 通配符匹配(Wildcard Pattern Matching ) 常量匹配 (Constant Pattern Matching ) 变量匹配(Variable Pattern Matching ) 构造函数匹配(Con

Scala链式编程内幕

1 package big.data.analyse.scala 2 3 /** 4 * 链式编程原理 5 * Created by zhen on 2018/12/16. 6 */ 7 class Computer{def code = this} 8 class PC extends Computer{def portable = this} 9 /** 10 * 使用type可以根据当前情况转化类型实现链式编程 11 */ 12 class Car{def run : this.type

【转】Scala学习——模式匹配和样例类

原文链接 http://nerd-is.in/2013-09/scala-learning-pattern-matching-and-case-classes/ 原文发表于:http://nerd-is.in/2013-09/scala-learning-pattern-matching-and-case-classes/ Scala强大的模式匹配机制,可以应用在switch语句.类型检查以及“析构”等场合. 样例类对模式匹配进行了优化. 更好的switch 1 2 3 4 5 6 7 8 va

Scala的模式匹配和条件类

树是在程序中常用的一个数据结构.例如编译器和解析器常常吧程序表示为树:XML文档结构也是树状的:还有一些集合是基于树的,例如红黑树.接下来我们将通过一个计算器程序来研究树在Scala中是如何表示和操纵的.这个程序的目标是处理一些由整数常量.变量和加号组成的简单的算数表达式,例如1 + 2 和 (x + x ) + (7 + y ).我们首先要决定如何表示这些表达式.最自然的方法就是树了,树的节点表示操作符(在这里只有加法),而树的叶节点表示值(这里表示常数和变量). 在Java中,这样的树可以表

【Scala】模式匹配和样本类

模式匹配 要理解模式匹配(pattern-matching),先把这两个单词拆开,先理解什么是模式(pattern),这里所的模式是数据结构上的,这个模式用于描述一个结构的组成. 我们很容易联想到"正则表达"里的模式,不错,这个pattern和正则里的pattern相似,不过适用范围更广,可以针对各种类型的数据结构,不像正则表达只是针对字符串.比如正则表达式里 "^A.*" 这个pattern 表示以A开头.后续一个或多个字符组成的字符串:List("A&

Scala的模式匹配

1.典型的模式匹配场景 (1)匹配字符串 object Test01 { def main(args: Array[String]): Unit = { val arr=Array("aa","bb","cc") //随机获取数组的任意元素 val index=Random.nextInt(3) val value=arr(index) //模式匹配 value match{ case "aa" => println(&

快学Scala(14)--模式匹配和样例类

更好的switch def main(args: Array[String]): Unit = { var sign: Int = 0 val ch: Char = '+' val color = Color.BLACK sign = ch match { case '+' => 1 case '-' => -1 case _ => 0 } color match { case Color.RED => ; case Color.BLACK => ; case _ =>

mahout demo——本质上是基于Hadoop的分步式算法实现,比如多节点的数据合并,数据排序,网路通信的效率,节点宕机重算,数据分步式存储

摘自:http://blog.fens.me/mahout-recommendation-api/ 测试程序:RecommenderTest.java 测试数据集:item.csv 1,101,5.0 1,102,3.0 1,103,2.5 2,101,2.0 2,102,2.5 2,103,5.0 2,104,2.0 3,101,2.5 3,104,4.0 3,105,4.5 测试程序:org.conan.mymahout.recommendation.job.RecommenderTest.

Coursera Algorithms第二周编程任务

Programming Assignment 2: Deques and Randomized Queues Write a generic data type for a deque and a randomized queue. The goal of this assignment is to implement elementary data structures using arrays and linked lists, and to introduce you to generic