0

重複の可能性:
Scala でカリー化された関数の背後にある理論的根拠は何ですか?

関数を宣言する方法は 2 つあります。1) カリー化を使用します。2) 関数をパラメーターとして使用します。

これが私のコードです:

def transform(f: Double => Double)(input: Double) = {
  f(input)
}                                                 

def transformVer2(f: Double => Double, input: Double) = {
  f(input)
}                                                 

transform(x=>x*x)(10)                             //> res8: Double = 100.0
transformVer2(x=>x*x, 10)                         //> res9: Double = 100.0

上記の 2 つの関数の宣言の実際の違いが何であるかはわかりません。教えてください。

ありがとう :)

4

1 に答える 1

0

前者はカリー化を採用し、後者はおそらく C や C++ などの言語でよく知られているものです。

カリー化は、関数型プログラミング言語で顕著なものです.関数型プログラミング言語は、関数と関数チェーンのアイデアを高く評価しているので、次のようなものです

def transform(f: Double => Double)(input: Double)

単一の引数として関数を受け取り、単一の引数として a を取り、 a を返すDouble => Double別の関数を返すものと見なすことができます。DoubleDouble

Programming in Scala で説明しているように、関数のカリー化によっていくつかの気の利いたこともできます。そのうちの 2 つが思い浮かびます。

  1. 型推論
  2. 新しいコントロールの抽象化

型推論については、次のようなものを検討してfoldLeftください。

val myVector = Vector(1, 2, 3, 4)
myVector.foldLeft(0.0)(_ + _)

foldLeftはカリー化0.0されており、初期値として指定することで、最終結果をDouble.

新しいコントロールの抽象化では、次のようなことができます

def doWithFileAndClose(file: File)(func: () => Unit): Unit =
  try { func() } finally { file.close }

これは次のように使用されます

doWithFileAndClose("somefile.txt") {
  /* do stuff */
}

これは、Scala が括弧の代わりに中括弧を受け入れることを利用しており、これにより、上記のコードはforandwhileループなどの見慣れた制御構造のように見えます。

于 2012-09-29T17:39:07.063 に答える