Scala School (6)
朝練エントリ。今日は Pattern matching & functional composition のページから。
Function Composition
以下の手続き (メソドになるのかな) を定義せよ、とのこと。
scala> def addUmm(x: String) = x + " umm" addUmm: (x: String)java.lang.String scala> def addAhem(x: String) = x + " ahem" addAhem: (x: String)java.lang.String
compose
partial なソレを使って (?) compose で合成できる模様。
scala> val ummThenAhem = addAhem _ compose addUmm _ ummThenAhem: String => java.lang.String = <function1> scala> ummThenAhem("well") res1: java.lang.String = well umm ahem
これ、メソドで云々してるけど手続きオブジェクトだとどうなるのかな。とは言え、先にすすめます。
andThen
compose が f(g(x)) という合成とするとこんどは逆で g(f(x)) という合成らしい。
scala> val ahemThenUmm = addAhem _ andThen addUmm _ ahemThenUmm: String => java.lang.String = <function1> scala> ahemThenUmm("well") res2: java.lang.String = well ahem umm
メソドではなくて手続きオブジェクトで云々、だとどうなるのか。気になる。
Currying vs Partial Application
case 文って PartialFunction って呼ばれてる function のサブクラス、とのこと。そして互いに compose された複数の PartialFunction が case 文の集合、とのこと。これはちょっとすぐにイメージできません。
Understanding PartialFunction
あ、PartialFunction と partially applied function は違う、ってありますね。同じ何かを、と勘違いしかけてました。例示されてるソレを確認してみます。
scala> val one: PartialFunction[Int, String] = { case 1 => "one" } one: PartialFunction[Int,String] = <function1> scala> one.isDefinedAt(1) res3: Boolean = true scala> one.isDefinedAt(2) res4: Boolean = false
one が束縛してるのは function1 なオブジェクトなのか。おそらく Int な引数で String を戻すんだろうな。
scala> one(1) res5: String = one
otherwise が無い状態でこうするとどうなるか。
scala> one(2)
例外吐きました。当り前と言えば当り前ですね。で、他のも定義して
scala> val two: PartialFunction[Int, String] = { case 2 => "two" } two: PartialFunction[Int,String] = <function1> scala> val three: PartialFunction[Int, String] = { case 3 => "three" } three: PartialFunction[Int,String] = <function1> scala> val wildcard: PartialFunction[Int, String] = { case _ => "something else" } wildcard: PartialFunction[Int,String] = <function1> scala> val partial = one orElse two orElse three orElse wildcard partial: PartialFunction[Int,String] = <function1>
合成なのか、と思ったら orElse て何でしょうね。なんとなく意味は分かりますが。最後で partial という手続きオブジェクトができた模様。
scala> partial(5) res7: String = something else scala> partial(3) res8: String = three scala> partial(2) res9: String = two scala> partial(1) res10: String = one scala> partial(0) res11: String = something else
The mystery of case.
確かに前のページで case class というソレが出てきてますね。つうか
{ case PhoneExt(name, extension) => extension < 200 }
な case をどう評価してるか、という話?
あ、テキストには続きがありますね。上のブロック (?) は (PhoneExt) => Boolean な手続きオブジェクトで、PartialFunction[PhoneExt,Boolean] て事なのかな。
そしてパタンマッチはこの PartialFunction というソレを使っているのかどうか。
時間切れ。現実トウヒなネタがどんどん積みあがっていきますね (何