モナドの機能を理解するのが難しいです。モナドのインスタンスとしての機能
>>=
の実装は少し不可解ようだが、:それについてのミランLipovačasaysは私が混乱して作るでも何instance Monad ((->) r) where return x = \_ -> x h >>= f = \w -> f (h w) w
:
機能
(->) r
はControl.Monad.Instances
で宣言に従ってモナドでありますそれは本当に すべてではありません。>>=
を使用して関数にモナドの値を入力すると、 の結果は常にモナドの値になります。この場合、 関数を別の関数に渡すと、結果も関数になります。それは なので、結果はラムダとして始まります。今までのところ、すべての実装は>>=
というように、モナドの値から何らかの形で結果を分離し、その結果に関数fを適用しました。同じ事が起こるのは ここです。関数から結果を得るには、 何かに適用する必要があります。そのため、をここで実行して 関数の結果を取得し、fを適用します。 fはモナドの値を返します。 はこの場合は関数なので、wにも適用します。
(>> =)の型シグネチャはこれです: (>> =)::ミリアンペア - だから私はh
は次のように入力されていることを取る>メガバイト
- >( - >メガバイト) m a
およびf
を(a -> m b)
とする。関数がm a
の場合は、a
型の値を返しますか?またはa
タイプの他のものを返すのですか?
h
の非モナド値をf
に供給されている場合、我々は得る: F(H w)は は正常に見えます。 f
は関数であり、その唯一の引数を取っているので、すでに値です、いいえ?モナド関数なので値もモナド値です。なぜそれは別の値w
が必要なのですか? w
〜f something
を非母語にすることはできません。つまり、それはもはや機能ではありません。 f something
とh
が同じ引数のw
をとり、異なる値のタイプ(m a
とm b
)を返す理由も理解できません。
ありがとうございます。すべてがクリアです! – amemus