2016-12-15 11 views
1

私はハスケルを学んでいます。私は、Haskellのどの関数も引数を1つしか取れないことを知っておく必要があります。だから、もしあなたが関数を見たらmax 2 4;実際には(max 2) 4です。彼らが言うのは、第1 2がパラメータとしてmaxに適用され、それはパラメータとして4をとる関数を返します。私が理解していないことは、2をmaxに適用するとどうなりますか? (max 2)という関数が返されたということはどういう意味ですか?カスケード関数はHaskellでどのように機能しますか?

私の質問をより明確にするために、別の例を挙げましょう。この機能を利用してください:multiply x y x = x*y*z彼らは実際にはこのように評価されていると言う:((multiply x) y) z。今私はこの入力を与えます:multiply 2*4*5 これはどのように評価されますか?

multiply 2 

戻り(multiply 2)と4は、パラメータとして適用されます。

(multiply 2) 4 

今、この戻り何をするか - ((multiply 2) 4)multiply 8を?このステップで4と2を乗算すると、Haskellはそれを行う必要があることをどのように知っていますか(関数は3つのパラメータだけを掛けることができるため)

+4

'(multiply 2)4 'を呼び出すと、結果の値は'(2を乗算する)4'、またはより明示的に '\ x - > 2 4 x'を乗算します。この段階では評価できないため、追加の評価は行われません。関数呼び出しが完全に飽和すると(その値が要求されると、Haskellは遅延しているがカレー化に関係なく)、関数が適用されます。 –

+1

"2 * 4 * 5'を乗算すると、" 2 2 4 5'を乗算する "という意味ですか? –

+2

Haskellのレポートでは、 'miltiply'に2つの引数が与えられた場合に何が起こるかは指定されていません。これは2つの議論で非常にうまくいくかもしれませんが、私はそれを実行する(完全なHaskellの)実装についてはわかりません。 – augustss

答えて

2

これを数学的に考える:2つの変数、すなわちf(x, y)を取る関数があるとします。 x=2は、一つの変数で、あなたに新しい機能を与えるだろう修正:g(y)=f(2, y)

は、xとyの最大値を与えるf(x, y) = max(x, y)場合、g(y) = f(2, y) = max(2, y)は2とyの最大値を与えます。

f(x, y, z) = x * y * z,g(y, z) = f(2, y, z) = 2 * y * zおよびh(z) = g(4, z) = f(2, 4, z) = 2 * 4 * zの場合。

また、x = 2とz = 4を修正してp(y) = f(2, y, 4)を形成することもできます。ハスケルでは、それが怠けて評価されているので、実際には2と4は乗算されません。つまり、そうするまで値を計算しません。

関連する問題