関数がモナドになる方法を理解するのに苦労しています。
関数は、 :(->) rの宣言によるとモナドです。Control.Monad.Instances
instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
MiranLipovačaがそれについて言っていることでさえ、私を混乱させます:
の実装
>>=は少しわかりにくいようですが、実際にはそれだけではありません。を使用>>=して関数にモナディック値をフィードすると、結果は常にモナディック値になります。したがって、この場合、関数を別の関数にフィードすると、結果も関数になります。そのため、結果はラムダとして始まります。これまでのすべての実装は>>=、常に何らかの形で結果をモナディック値から分離し、関数fをその結果に適用していました。ここでも同じことが起こります。関数から結果を取得するには、それを何かに適用する必要があります(h w)。そのため、ここでは関数から結果を取得し、それにfを適用します。fは、この場合の関数であるモナディック値を返すため、wにも適用します。
(>> =)の型アノテーションは次のとおりです:(>> =):: ma->(a-> mb)-> mb
だから私はそれhがとタイプされているm aと思います。関数がの場合、型の値を返しますか?またはそれはタイプを取る何か他のものを返しますか?f(a -> m b)m aaa
の非モナド値hがに供給されるとf、次のようになります。f(hw)問題ないように見えます。fは関数であり、その唯一の引数を取っているので、それはすでに値ですよね?これはモナディック関数であるため、値もモナディック値です。では、なぜ別の値が必要なのですwか?それを非モナディックにするために餌wを与えていませんか?つまり、それはもはや機能ではありませんか?また、理由をf something理解できず、同じ引数を取り、異なる値型(および)を返します。f somethinghwm am b