2016-03-19 7 views
4

次の2つの高次関数は同じ結果をもたらしますが、私はこの2つの違いを理解することができません。実際、私は1)を理解していない。関数はどのようにして()の2つのセットを持つことができますか?これら2つの上位関数はどのように異なっていますか?

1)

def sum(f: Int => Int) (a: Int, b: Int) = { 
    def loop(a: Int, acc: Int) : Int = 
     if (a > b) acc 
     else loop (a + 1, f(a) + acc) 
    loop (a, 0) 
} 

2)

def sum(f: Int => Int, a: Int, b: Int) = { 
     def loop(a: Int, acc: Int) : Int = 
     if (a > b) acc 
     else loop (a + 1, f(a) + acc) 
     loop (a, 0) 
} 
+0

スカラ関数は、( 'sum'の最初の定義のように)複数のパラメータリストを持つことができます。 http://docs.scala-lang.org/tutorials/tour/currying.htmlを参照してください。 – Jubobs

+0

http://stackoverflow.com/questions/36314/what-is-curryingを参照してください。 –

答えて

3

最初の関数はカリーあります。つまり、部分的に適用することができます。最初のパラメータリストのみを使用する場合は、関数(Int, Int) => Intを持つ別の関数が返されます。

特定の関数シグネチャを持つ関数をmapreduceのような上位関数に渡す必要がある場合には、これは本当に便利です。

Haskellのような他の関数型プログラミング言語では、すべての関数がデフォルトでカリーされます。 興味がある場合に備えて、このトピックに関する全ブログ投稿を書いた。あなたはそれを読むことができますright here.

+0

ブログのリンクを投稿できますか?ありがとう – johnsam

+0

それはそこにあります:) –

+0

従って2)は高次関数です。そして1)そうではありませんか? 1)代わりにカレーですか? – johnsam

関連する問題