Scala School (2)

急遽子供会の交通整理をせねばならなくなったので自宅朝練。つうかかなり雨が強いな。今日も以下を確認しつつ、ということになります。

Functions

Curried functions

引数の部分適用だけではなくて後で評価するために引数リスト自体を複数保持できるらしい。例示されているのが以下。

scala> def multiply(m: Int)(n: Int): Int = m * n
multiply: (m: Int)(n: Int)Int

この手続きオブジェクトはいきなり二つ引数渡して呼び出しも可能。

scala> multiply(2)(3)
res0: Int = 6

以下は最初のソレを渡して二番目はスルーの例。

scala> val timesTwo = multiply(2) _
timesTwo: Int => Int = <function1>

scala> timesTwo(3)
res1: Int = 6

こんなこともできるのかな?

scala> val timesThree = multiply(_:Int)(3)
timesThree: Int => Int = <function1>

scala> timesThree(2)
res2: Int = 6

次は curried ってこれ手続きなのかな。その例が出てます。

scala > def adder(m: Int, n: Int) = m + n
adder: (m: Int, n: Int)Int

scala> var f1 = (adder _).curried
f1: Int => Int => Int = <function1>

scala> var f2 = f1(2)
f2: Int => Int = <function1>

scala> f2(3)
res3: Int = 5

一気にヤッてしまいましたが単一の引数リストをばらばらにしてしまう、という理解で良いのかどうか。

Variable length arguments

ここはちょいスルーで。String* ってのが特別な書き方なのかな。

def capitalizeAll(args: String*) = {
  args.map { arg =>
    arg.capitalize
  }
}

別件対応あるので今朝はここで終わり。