最近、私はモナドがどのように機能するかについての知識を払拭しています。私はまたの概念を導入してきた「Comonad」として記述され、逆モナドのデュアル。しかし、頭を包むことはできません。
モナドを理解するために、私は自分自身に類推しました:
モナドは、「表現のコンベアベルトを構築するための青写真」と見ることができます。
新しいMonad(新しい種類のコンベアベルトシステム)を定義するには、以下を定義する必要があります。
- コンベアベルトに何かを置く方法。たとえば、コンベアベルトを「開始」します。(
unit
またはとして知られているreturn
)- コンベアベルトの一部となるマシン(表現)をコンベアベルトに接続する方法。(
join
またはbind
またはとして知られてい>>=
ます)。(現在のコンベヤーベルトを取り出し、その内容物を捨て、として知られる新しいコンベヤーベルトを開始する3番目の操作がありますが、
>>
使用されることはほとんどありません。)機械とコンベアが適切に連携するには、次のことを確認する必要があります。
- コンベアベルトに何かを置いて機械に通した場合、出力は手動で機械に通したときと同じになります。(左身元)
- 既存のコンベヤーベルトの間にコンベヤーベルトを配置する場合、コンベヤーベルトが上にあるコンベヤーベルトではなく、単一の長いコンベヤーベルトで終わる必要があります。 (正しいアイデンティティ)
- マシンAを手動で使用し、コンベヤーに接続されたBCを介して結果を渡す場合、またはコンベヤーに接続されたABを使用し、Cを介して結果を手動で渡す場合、出力は重要ではありません。つまり、((a >> = b)>> = c)は(a >> =(b >> = c))と同じである必要があります(結合性)
最も単純なコンベアベルトは、単に入力を受け取り、常に次の式に進むものです。これが「パイプライン」です。
別の可能性は、値に対して何らかの条件が満たされた場合にのみ次のマシンを通過させることです。つまり、中間の式の一部で値が許可されていないものに変更された場合、残りの式はスキップされます。これがHaskellで 'Maybe'モナドが行うことです。
また、値をマシンに渡す前または後に、値に対して他の派手な条件付きコピー/変更ルールを実行できます。例:パーサー(ここで、式が「失敗」の結果を返す場合、式の前の値が 出力として使用されます)。
もちろん、アナロジーは完全ではありませんが、モナドがどのように機能するかを大まかに表してくれることを願っています。
しかし、私はコモナドを理解するためにこの類推を頭に置くのに苦労しています。インターネット上で見つけたわずかな情報から、コモナドが定義していることを知っています。
extract
、これはの逆ですreturn
。つまり、Comonad から値を取得します。duplicate
、これはの逆のようなjoin
ものです。つまり、1つのComonadsから2つのComonadを作成します。
しかし、Comonadから抽出または複製しかできない場合、Comonadはどのようにインスタンス化できますか?そして、実際にどのように使用できますか?私はこの非常に素晴らしいプロジェクトとそれについての話を見ましたが(残念ながらほとんど理解していませんでした)、機能のどの部分がComonadによって正確に提供されるのかわかりません。
コモナとは何ですか?彼らは何のために役立ちますか?どのように使用できますか?彼らは食用ですか?
IO
は、Haskellランタイムシステムmain
です。unsafePerformIO
もちろん、もあります。Maybe
モナドが「コンベアベルトの端にあるマシン」を持っていると考えたい場合は、を使用できますmaybe
。
cobind
アプリケーションの開始時に共通の値を生成したい場合は、共通の内部表現で何か有用な機能を実行する必要があります。