2

「smallerc」という関数があると仮定します

    smallerc :: Integer -> (Integer->Integer)
    smallerc x y = if x <=y then x else y

以下を使用して関数を宣言してみませんか。

    smallerc :: (Integer -> Integer) ->Integer

ありがとうございました!

4

2 に答える 2

12

カリー化を理解するための鍵は、複数の引数を持つ関数のようなものは存在しないことを理解することです。haskellのすべての関数には1つの引数がありますしかし、->演算子の右結合法則のため、それはすぐには明らかではありません。

あなたがこれを見るとき:

Integer -> Integer -> Integer

これと同等です:

Integer -> (Integer -> Integer)

どちらの場合も、関数はを受け取り、関数Integer返します。(返される関数は、を取り、Integerを返す関数Integerです。)したがって、これは単純な数学演算のようなものである可能性があります。それはInteger(たとえば5)を取り、別のInteger(5をもう一度)取り、それを最初の関数に追加し、結果(10)を返す関数を返します。

しかし、これを行うと:

(Integer -> Integer) -> Integer

非常に異なるものを作成しました。関数を受け取り、を返す関数Integerです。これは、数学関数を実装する方法でもあります。Integerしかし、最初の引数としてをとる代わりに、それは数学演算自体を取ります!したがって、たとえば、この関数に渡されたものに5を追加する関数を渡したとします。次に、この関数はその関数に渡さ5れ、結果(10)を返します。

于 2012-04-27T21:03:18.620 に答える
1

矢印演算子は右結合です。つまり、最初の例は、を取り、整数を取り、整数を返す関数をInteger返す関数です。Integer -> Integer対照的に、2番目の例は、関数を受け取り、Integer -> Integerを返す関数Integerです。

于 2012-04-27T20:59:37.217 に答える