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