おそらく最善の方法は、2つの単純な関数について考えることです。
f :: a -> (b -> c)
g :: (a -> b) -> c
これらの関数を順番に見ていきましょう。
最初の関数、fは、型の単一のパラメーターを取り、型aの関数を返しますb -> c。つまり、、、、および:を想定してx :: a、次のように記述できます。y :: bz :: c
f :: a -> (b -> c)
f x = f'
where f' :: b -> C
f' y = z
の署名を書く別の方法fは次のとおりです。
f :: a -> b -> c
これは、デフォルトで->右側にバインドするために機能します。また、別の同等の理解方法も提供します。これは、型との2つのパラメーターを取り、型の結果を生成するf関数と考えることができます。abc
2番目の関数gは、型の関数である1つの引数を取りますa -> b。
g :: (a -> b) -> c
g h = z
where h :: a -> b
したがって、2つは非常に異なります。
これを関数に適用すると、最初の関数は4つのタイプの値を取りInt、を返しますInt。2番目の関数は型の単一((Int -> Int) -> Int) -> Intの関数を取り、それは型の3番目の関数を取り、(Int -> Int)を生成する関数ですInt。