4

私はscalaを初めて使用し、カリー化を理解するのに少し苦労しています.今のところ単純な関数をコーディングすることで練習しています.次のことについて明確にする必要があります.

 def mul (a: Int) (b: Int): Int =
  {
  {
  a * b
  }
  } 

上記の関数定義は以下と同じですか?

def mul: Int => Int => Int = {
  (a: Int) =>
    {
      (b: Int) =>
        a * b
    }
}

mul構文から、整数を受け入れ、整数を受け入れて整数を返す関数を返す関数として解釈できます。しかし、私の解釈が本当に正しいかどうかはわかりません。上記の例またはカリー化された関数の構文に関する説明は、非常に役立ちます。

4

1 に答える 1

10

あなたの解釈は正しいです。しかし、これらすべての中括弧は必要ありません。

def mul(a: Int)(b: Int) = a*b

val mulAB = (a: Int) => { (b: Int) => a*b }   // Same as mul _
val mul5B = (b: Int) => 5*b                   // Same as mulAb(5) or mul(5) _

一般に、複数の引数を持つ関数は、代わりにカリー化されたチェーンとして書き換えることができます。この場合、各引数は、最後の引数が実際に値を生成するまで、1 つ少ない引数を取る関数を生成します。

f(a: A ,b: B ,c: C, d: D): E  <===>  A => B => C => D => E

Scala では、自然なグループ化は個々のパラメーターごとではなく、パラメーター ブロックごとに行われるため、

f(a: A)(b: B, c: C)(d: D): E  <===>  A => (B,C) => D => E
于 2012-09-27T11:31:37.463 に答える