bind 関数は合成関数と非常に似ているように見えます。また、モナドを返す関数を作成するのにも役立ちます。
このアイデアよりもモナドについて啓発的なものはありますか?
このアイデアよりもモナドについて啓発的なものはありますか?
はい、とてもそうです!
モナディックバインディングは、入力への関数の適用に加えて何か他のことが起こっている関数を構成する方法です。他の何かが何であるかは、検討中のモナドに依存します。
Maybe
モナドは、チェーン内の関数の 1 つが失敗する可能性がある関数合成であり、その場合、失敗はチェーンの最後に自動的に伝播されます。式は値にreturn x >>= f >>= g
適用されます。結果が(つまり、失敗) の場合、式全体が を返し、他の作業は行われません。それ以外の場合は に適用され、その結果が返されます。f
x
Nothing
Nothing
g
f x
Either e
ある型であるモナドは、型のe
エラーで失敗する可能性がある関数合成e
です。これは概念的にはモナドに似ていMaybe
ますが、失敗がどのように、どこで発生したかについて、より多くの情報を得ることができます。
List
モナドは、複数の値を返す可能性のある関数合成です。f
とg
が出力のリストを返す関数である場合、 にreturn x >>= f >>= g
適用さf
れx
、さらにのすべてのg
出力に適用f
され、これらのアプリケーションのすべての出力が 1 つの大きなリストにまとめられます。
他のモナドは、他のさまざまなコンテキストで関数合成を表します。非常に簡単に:
Writer w
モナドは型の値を横に積み上げた関数合成ですw
。たとえば、頻繁にw = [String]
(文字列のリスト) をログに記録するのに役立ちます。
モナドは、Reader r
各関数が type の値に依存することも許可されている関数合成ですr
。r
これは、言語内の変数名から値へのマップである可能性がある場合に、ドメイン固有言語のエバリュエーターを構築する場合に役立ちます。これにより、たとえば字句クロージャの簡単な実装が可能になります。
モナドは、リーダーとライターのState s
組み合わせに少し似ています。これは、各関数が type の値に依存し、変更できる関数合成ですs
。
実際、構成の観点は、それ自体が非常に啓発的です。
モナドは、 の関数間の「ファンキーな構成」の一部と見なすことができますa -> Mb
。f : a -> M b
モナド操作を介してandg: b -> M c
を somethingに合成できますa -> M c
(の戻り値をf
into にバインドするだけ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 に似た言語を知っている場合は、「オーバーロード可能なセミコロン」と見なすことができます。このようにモナドについて考えるのは非常に有益です。IO
List
Maybe
Nothing
Writer
State
もちろん、Dan Piponi はこれについて私よりもずっとよく説明しています。 html