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 というソレを使っているのかどうか。
時間切れ。現実トウヒなネタがどんどん積みあがっていきますね (何