「smallerc」という関数があると仮定します
smallerc :: Integer -> (Integer->Integer)
smallerc x y = if x <=y then x else y
以下を使用して関数を宣言してみませんか。
smallerc :: (Integer -> Integer) ->Integer
ありがとうございました!
「smallerc」という関数があると仮定します
smallerc :: Integer -> (Integer->Integer)
smallerc x y = if x <=y then x else y
以下を使用して関数を宣言してみませんか。
smallerc :: (Integer -> Integer) ->Integer
ありがとうございました!
カリー化を理解するための鍵は、複数の引数を持つ関数のようなものは存在しないことを理解することです。haskellのすべての関数には1つの引数があります。しかし、->
演算子の右結合法則のため、それはすぐには明らかではありません。
あなたがこれを見るとき:
Integer -> Integer -> Integer
これと同等です:
Integer -> (Integer -> Integer)
どちらの場合も、関数はを受け取り、関数Integer
を返します。(返される関数は、を取り、Integer
を返す関数Integer
です。)したがって、これは単純な数学演算のようなものである可能性があります。それはInteger
(たとえば5)を取り、別のInteger
(5をもう一度)取り、それを最初の関数に追加し、結果(10)を返す関数を返します。
しかし、これを行うと:
(Integer -> Integer) -> Integer
非常に異なるものを作成しました。関数を受け取り、を返す関数Integer
です。これは、数学関数を実装する方法でもあります。Integer
しかし、最初の引数としてをとる代わりに、それは数学演算自体を取ります!したがって、たとえば、この関数に渡されたものに5を追加する関数を渡したとします。次に、この関数はその関数に渡さ5
れ、結果(10)を返します。
矢印演算子は右結合です。つまり、最初の例は、を取り、整数を取り、整数を返す関数をInteger
返す関数です。Integer -> Integer
対照的に、2番目の例は、関数を受け取り、Integer -> Integer
を返す関数Integer
です。