したがって、この時点で、カリー化または部分適用f :: a -> b -> cについて確かに聞いたことがあるx :: aでしょうf x :: b -> c。つまり、 Iffは 2 引数の関数であり、 の最初の引数のx型を持ちf、 thenf xは 2 番目の引数を取り、アプリケーションを「完了する」関数です。
まあ、Haskell では、同じことが のような型コンストラクタに適用されStateます。型と型コンストラクターにはkindがあります。これは、値に型があるのと似ています。Integerhas 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種類があるので許されます* -> *。
Monadkind の型に適用されることをどのように知ることができ* -> *ますか? クラス宣言からそれを推測できます。
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