6

bind 関数は合成関数と非常に似ているように見えます。また、モナドを返す関数を作成するのにも役立ちます。

このアイデアよりもモナドについて啓発的なものはありますか?

4

2 に答える 2

15

このアイデアよりもモナドについて啓発的なものはありますか?

はい、とてもそうです!

モナディックバインディングは、入力への関数の適用に加えて何か他のことが起こっている関数を構成する方法です。他の何かが何であるかは、検討中のモナドに依存します。

  • Maybeモナドは、チェーン内の関数の 1 つが失敗する可能性がある関数合成であり、その場合、失敗はチェーンの最後に自動的に伝播されます。式は値にreturn x >>= f >>= g適用されます。結果が(つまり、失敗) の場合、式全体が を返し、他の作業は行われません。それ以外の場合は に適用され、その結果が返されます。fxNothingNothinggf x

  • Either eある型であるモナドは、型のeエラーで失敗する可能性がある関数合成eです。これは概念的にはモナドに似ていMaybeますが、失敗がどのように、どこで発生したかについて、より多くの情報を得ることができます。

  • Listモナドは、複数の値を返す可能性のある関数合成です。fgが出力のリストを返す関数である場合、 にreturn x >>= f >>= g適用さfx、さらにのすべてのg出力に適用fされ、これらのアプリケーションのすべての出力が 1 つの大きなリストにまとめられます。

他のモナドは、他のさまざまなコンテキストで関数合成を表します。非常に簡単に:

  • Writer wモナドは型の値を横に積み上げた関数合成ですw。たとえば、頻繁にw = [String](文字列のリスト) をログに記録するのに役立ちます。

  • モナドは、Reader r各関数が type の値に依存することも許可されている関数合成ですrrこれは、言語内の変数名から値へのマップである可能性がある場合に、ドメイン固有言語のエバリュエーターを構築する場合に役立ちます。これにより、たとえば字句クロージャの簡単な実装が可能になります。

  • モナドは、リーダーとライターのState s組み合わせに少し似ています。これは、各関数が type の値に依存し、変更できる関数合成ですs

于 2012-06-02T11:50:40.710 に答える
6

実際、構成の観点は、それ自体が非常に啓発的です。

モナドは、 の関数間の「ファンキーな構成」の一部と見なすことができますa -> Mbf : a -> M bモナド操作を介してandg: b -> M cを somethingに合成できますa -> M c(の戻り値をfinto にバインドするだけgです)。

これは、 の形の矢印を、 のクライスリ カテゴリーa -> M b呼ばれるカテゴリーの矢印に変えます。M

Mがモナドではなく単なる関手である場合、合成して何かにすることしかできfmap gませf(fmap g) . f :: a -> M (M c)。モナドにはjoin :: M (M a) -> M a、モナド操作のみを使用する (簡単で便利な) 演習として定義できるものがあります (数学者にとってjoinは、通常、モナドの定義の一部です)。次にjoin . (fmap g) . f、クライスリ カテゴリの構成を提供します。

したがって、モナド構成のすべてのファンクは、 の内部joinで発生することがわかります , は副作用の構成をjoin表します:は効果を順序付けし、リストを連結し、結果がの場合に「計算を停止」し、書き込みを順序付けします。状態などに対する操作をシーケンス化するためです。C に似た言語を知っている場合は、「オーバーロード可能なセミコロン」と見なすことができます。このようにモナドについて考えるのは非常に有益です。IOListMaybeNothingWriterState

もちろん、Dan Piponi はこれについて私よりもずっとよく説明しています。 html

于 2012-06-02T11:44:01.317 に答える