したがって、この時点で、カリー化または部分適用f :: a -> b -> c
について確かに聞いたことがあるx :: a
でしょうf x :: b -> c
。つまり、 Iff
は 2 引数の関数であり、 の最初の引数のx
型を持ちf
、 thenf x
は 2 番目の引数を取り、アプリケーションを「完了する」関数です。
まあ、Haskell では、同じことが のような型コンストラクタに適用されState
ます。型と型コンストラクターにはkindがあります。これは、値に型があるのと似ています。Integer
has kindのような非パラメトリック型*
。のような 1 つのパラメーターの型にMaybe
は kind が* -> *
あります。State
種類があり* -> * -> *
ます。
そして、は型構築State state
子の部分適用であり、 kind を持っています。 kind に適用されるクラスです。したがって、私たちの例に適用されます:State
* -> *
Monad
* -> *
instance Monad (Integer) where ...
Integer
種類がございますのでお断りさせて頂いており*
ます。
instance Monad (Maybe) where ...
Maybe
種類があるので許されます* -> *
。
instance Monad (State) where ...
State
種類がございますのでお断りさせて頂いており* -> * -> *
ます。
instance Monad (State st) where ...
State st
種類があるので許されます* -> *
。
Monad
kind の型に適用されることをどのように知ることができ* -> *
ますか? クラス宣言からそれを推測できます。
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
-- ...
m
このクラス宣言で がどのように使用されているm a
かを見てくださいm b
。このため、Haskell はそれm
が kind の型変数であると推測します* -> *
。
これと比較してください:
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
-- ...
ここで、型変数a
は他の型変数には適用されません — したがって、それは kind でなければなりません*
。
厳密に言えば、State
モナドではありません。これは、1 つの型だけに部分的に適用されると、モナドを与える 2 箇所の型コンストラクターです。モナドState state
もそのままState Integer
です。State [a]
_ _そのパラメータの型が異なります。State