Haskell[1] 型シグネチャは 3 つの要素で構成されています
- タイプ変数。
- それらは暗黙のうちに普遍的に量化されています。構文的には、小文字で始まります。
- 具体的なタイプ。
- それらは、型変数を埋める実際の「もの」です。大文字で始まります。
- 関数矢印。
- これは、機能を表しています。それはカレーで何とか何とか何とかです。構文的には矢印です。
あなたの例では、2つの要素があります。a
、b
、およびf
は型変数であり、関数矢印があります。
a
つまり、具象型によってそのままインスタンス化できますb
。一方、[2] の種類があります。つまり、 と と同じ方法でインスタンス化することはできません。種類の型を取り、具体的な型を生成する型でインスタンス化する必要があります。*
f
* -> *
f
a
b
*
たとえば、その型の値を構築する前にMaybe
、別の型、たとえば を指定する必要があります。Int
たとえば、しかし意味Just 1 :: Maybe Int
がwat :: Maybe
ありません。したがって、適用は、型を除いて、 value-function をf a
value に適用するのと同じです。部分適用もあります!f
a
したがって、「あるタイプを取り、それをあるタイプに適用し、あるタイプに適用されたタイプの値を返すf a -> f b
関数」と読みます。f
a
f
b
[1] Haskell とは、バニラ Haskell のことです。型演算子、ランク N 型などは物事を複雑にします。
[2] これは通常の機能ではありません->
。値ではなく型について話しています。