Scalaのパターンマッチングの本質は何ですか?-Courseraのレスポンスプログラミングから

4941 ワード

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)=>「」+「:」+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のFunction 1の略です.では上のJBinding=>Stringはscalaです.Function1[JBinding, String]
trait Function 1の定義(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の方法のマッチングに帰結して、それからすべてまた固有の思考によって見ることができます.