2008年8月31日日曜日

Scalaの高階関数

無名関数
書式はこんな感じ。

(x1: T1, ..., xn: Tn) => E

これは、以下と等しい。

{ def f (x1: T1, ..., xn: Tn) = E ; f _ }

うむ。すっきり。

カリー化
ここでなんだか残念な事態が判明する。
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a + 1, b)

def sumInts(a: Int, b: Int): Int = sum((x: Int) => x, a, b)
def sumSquares(a: Int, b: Int): Int = sum((x: Int) => x * x, a, b)
この高階関数をカリー化する際には、sumを
def sum(f: Int => Int): (Int, Int) => Int = {
if (a > b) 0 else f(a) + sum(f)(a + 1, b)
}
こんな風に書き換えた上で、呼び出し時には
def sumInts = sum(x => x) _
def sumSquares = sum(x => x * x) _
とか
val sumInts = sum(x => x) _
val sumSquares = sum(x => x * x) _
とか書かなければならないらしい。なんということだ。これじゃ、カリー化したい組み合わせが変わるごとに別々に定義が必要じゃないか。いけてない…。しかも、呼び出し時によくわからん「_」をつけなければならないとは…。これが静的言語の宿命なのか?残念だ。

0 件のコメント: