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