4

以下はカリー化の良い例ですか?

def sum(a: Int, b: Int) : (Int => Int) = {
    def go(a: Int) : Int = {
        a + b;
    }
    go
}

私は以下の結果を半分理解していますが、どのように書くことができますか (または、おそらくどのように書くべきでしたか) sum()、カリー化された方法でしょうか?

scala> sum(3,4) res0: Int => Int = <function1>
scala> sum(3,4).apply(2) res1: Int = 6
scala> sum(3,4).apply(3) res2: Int = 7
4

3 に答える 3

4

ラムダ計算では、ラムダ抽象化と呼ばれるものがあり、λx.term1これを別の用語(λx.term1)(term2)に適用すると、関数を に適用する概念に対応しterm2ます。ラムダ計算は、関数型プログラミングの理論的基礎です。ラムダ計算では、複数のパラメーターを取るラムダ抽象化はありません。では、2 引数の関数をどのように表現しますか? 答えは、もう一方の引数を取り、両方の引数で結果を返す関数を返すことです。

したがって、Scala では、aスコープ内に var がある場合、その引数bをに追加する関数を返すことができaます。

scala> var a = 1
a: Int = 1

scala> val adda = (b: Int) => a + b
adda: Int => Int = <function1>

scala> adda(3)
res1: Int = 4

スコープ内に引数がある場合は、a同様に機能します。

scala> val sum = (a: Int) => (b: Int) => a + b
sum: Int => Int => Int = <function1>

scala> sum(3)(5)
res2: Int = 8

したがって、2 つの引数の関数を定義できる構文にアクセスできなくても、基本的には、引数を取り、 を返す関数と同等の関数を返す引数を取る関数でそれsuma実現できaddaます。そして、それはカリー化と呼ばれます。ba + b

演習として、カリー化を使用して 3 つの引数を操作できる関数を定義します。たとえばval sum3: Int => Int => Int => Int = ???、疑問符に入る内容を入力します。

于 2013-07-21T17:19:37.547 に答える