関数がモナドになる方法を理解するのに苦労しています。
関数は、 :(->) 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 a
a
a
の非モナド値h
がに供給されるとf
、次のようになります。f(hw)問題ないように見えます。f
は関数であり、その唯一の引数を取っているので、それはすでに値ですよね?これはモナディック関数であるため、値もモナディック値です。では、なぜ別の値が必要なのですw
か?それを非モナディックにするために餌w
を与えていませんか?つまり、それはもはや機能ではありませんか?また、理由をf something
理解できず、同じ引数を取り、異なる値型(および)を返します。f something
h
w
m a
m b