4

私はこのHaskellコード部分を持っています:

newtype State st a = State (st -> (st, a))

instance Monad (State state) where
    return x = let f t = (t,x) in State f

    State f >>= g = State (\oldstate ->
                let {(newstate, val) = f oldstate;
                  State f'= g val}
                in f' newstate)

私はモナドに不慣れですが、私は一般的なケースでどのようreturnに機能するかを理解したと思います。bind

しかし、上記の例では、多くの問題があります。

  1. Monad (State state)はモナドの名前ですか?それはどのように関係していnewtype State ...ますか?
  2. return x = let f t = (t,x) in State fどこtから来たの?
4

2 に答える 2

8

したがって、この時点で、カリー化または部分適用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* -> *

  1. instance Monad (Integer) where ...Integer種類がございますのでお断りさせて頂いており*ます。
  2. instance Monad (Maybe) where ...Maybe種類があるので許されます* -> *
  3. instance Monad (State) where ...State種類がございますのでお断りさせて頂いており* -> * -> *ます。
  4. 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

于 2012-06-05T22:22:35.030 に答える
1
  1. Stateはモナドの型であり、のインスタンスであるinstance Monad (State state)と宣言していますState state(ここで、stateは他の任意の型*に設定できる型変数です)Monadnewtype Stateタイプの定義ですState
  2. let f t = (t, x)は、という名前の引数を使用して関数を定義していますt

*技術的にstateは、は種類の型変数ですが、*心配する必要はありません。

于 2012-06-05T18:50:38.843 に答える