ラムダ計算では、ラムダ抽象化と呼ばれるものがあり、λ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 つの引数の関数を定義できる構文にアクセスできなくても、基本的には、引数を取り、 を返す関数と同等の関数を返す引数を取る関数でそれsum
をa
実現できadda
ます。そして、それはカリー化と呼ばれます。b
a + b
演習として、カリー化を使用して 3 つの引数を操作できる関数を定義します。たとえばval sum3: Int => Int => Int => Int = ???
、疑問符に入る内容を入力します。