Scalaのパターンマッチングの本質は何ですか?-Courseraのレスポンスプログラミングから
4941 ワード
Courseraの応答型プログラミングコースをお勧めします.このコースはscala言語の進級コースです.
カリキュラムの始まりは、Json列を構築し、Jsonを知らない学生が勝手にgoogleするという応用シーンを提案した.
これらのことを行うために、次のクラスを定義しました.
次にJsonオブジェクトを構築します
そしてJsonを表示します
を選択すると、次のようになります.
私たちが考えなければならないのは、この一節です.
{ 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の方法のマッチングに帰結して、それからすべてまた固有の思考によって見ることができます.
カリキュラムの始まりは、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の方法のマッチングに帰結して、それからすべてまた固有の思考によって見ることができます.