2

Scalaでカレー機能がどのように機能するのかちょっと混乱します。 次のコードをコンパイルしていますが、わかりません。Scalaでカルト関数を呼び出す?

def fixedPoint(f: Double => Double, initialGuess: Double) = { 
    //dummy impl, does nothing. 
} 

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2 

def sqrt(x: Int) = { 
    fixedPoint(averageDamp(y => x/y))(1) 
} 

このコードは罰金コンパイルが、私はまた、別のパラメータを取るためにaverageDampニーズを考えているのでしょうか?だから、次のようになります。

fixedPoint(averageDamp(y=> x/y)(1))(1) 

しかし、これはコンパイルできない、と私は型の不一致を言うメッセージが表示されます。見つかった:ダブルが必要:ダブル⇒ダブルを

を次は理にかなっている、コンパイルされません:「オブジェクトfoo適用されていない方法でメソッドaverageDampの引数リストを逃すことだけです:

val num = averageDamp(y => x/y) 

これはコンパイルエラーメッセージを表示します関数型が期待されるときには 関数に変換されます。

fixedPointの呼び出しの中でaverageDampを1つのパラメータで呼び出すときにコンパイルされる理由はわかりませんが、それを単独で呼び出すとコンパイルできません。

助けがあれば助かります。

+0

申し訳ありませんが、誤植。 – user1974753

+0

実際にコンパイルすると主張するコードは、パラメータがないために発生しません... –

答えて

4

それを置くために有効でない(つまり、1つの以上のパラメータを持っている)averageDampは、1つの以上のパラメータのリストを必要とするにもかかわらず、このライン

fixedPoint(averageDamp(y => x/y), 1) 

def fixedPoint(f: Double => Double, initialGuess: Double) = { 
    //dummy impl, does nothing. 
} 

def averageDamp(f: Double => Double)(x: Double) = (x + f(x))/2 

def sqrt(x: Int) = { 
    fixedPoint(averageDamp(y => x/y), 1) 
} 

をコンパイルしたコードです。実際には、これが最初にカレーとして定義された理由です。これを関数として使用することができます。

scala>  val num = averageDamp(y => 5/y)(1) 
num: Double = 3.0 

おそらく予想通り、Doubleという結果が得られます。

2番目のパラメータリストを渡さない場合は、機能を受け取ることができ

val fun = averageDamp(y => 5/y) 

はあなたがfunの機能になりたいコンパイラに通知する必要があることを教えてくれしようとするあなたにエラーが発生します。次の方法でこれを行うことができます:

scala>  val fun: Double => Double = averageDamp(y => 5/y) 
fun: Double => Double = <function1> 
scala>  val fun = averageDamp(y => 5/y) _ 
fun: Double => Double = <function1> 

fixedPoint

def fixedPoint(f: Double => Double, initialGuess: Double) 

を見て、それが期待する機能Double => Doubleは、私たちはそれが

fixedPoint(averageDamp(y => 5/y), 1) 

コンパイラは最初のパラメータがなければならないことを知って渡すことができますこの知識を使ってこのメソッドをまだx: Doubleパラメータを取っていない関数に変換し、を返します

+0

"でも、averageDampはもう1つのパラメータ**リスト**を必要としますが、これはたまたま1つのパラメータを持つことになります..."あなたはパラメータリスト全体を除外することしかできません。 –

+0

私が知っていることは、後でパラメータのリストにあてはめが適用されることですが、最初からそれを複雑にしたくはありませんでした。あなたがセマンティクスに徹底しない限り、文章そのものは与えられた文脈で真実だと思いますが、わかりやすくするために編集します。ありがとうございました。 –