0

カリー化された関数についてどこかで読んでいましたが、混乱しているように聞こえました。この例は私をさらに混乱させました。関数があるとしましょう:

power :: (Int, Float) -> Float -- computes the nth power of b
power (n, b) =
    if n == 0 then 1.0 else b * power (n-1, b)

powerc:: Int -> Float -> Floatここで、次のような別の関数を定義します

powerc n b =
    if n == 0 then 1.0 else b * powerc (n-1) b

powerc関数のカリー化されたバージョンがどのように機能するかを誰かに説明してもらえますかpower

4

2 に答える 2

5

前者はInt, Floatタプルを受け取る関数ですが、後者は基本的に、それぞれが1つの引数を取り、次の引数を受け取る関数を返す関数のチェーンです。

つまり、powercを取り、を取り、を取り、Intを返す関数Float返しますFloat

部分適用でこれを利用することができます。たとえば、square = powerc 2またはcube = powerc 3それぞれが、キャプチャされFloat -> Floatた値を持つ単純な関数です。n

カレーのない関数では、この簡単な部分適用はできません。先行引数が関数の動作の一種の1回限りの構成である場合は、部分適用を使用すると便利です。また、関数の形状を変更して高階関数に渡す場合にも特に役立ちます。たとえばpowerc 2、リストに(定義せずに)マップして、すべてを2乗することができます。

お役に立てば幸いです。

于 2012-10-24T14:45:59.983 に答える
5

powerc部分適用が許可されるようになったため:

square = powerc 2

ところで、

powerc = curry power
于 2012-10-24T14:24:54.663 に答える