web-dev-qa-db-ja.com

HaskellのComonadタイプクラスとは何ですか?

HaskellのComonadタイプクラスとは何ですか? comonadパッケージのControl.Comonad からのComonadのように(Comonadタイプクラスを提供する他のパッケージの説明も歓迎します)。私は漠然とComonadについて聞いたことがありますが、それについて本当に知っているのは、それがextract :: w a -> a、モナドのreturn :: a -> m a

「実際の」コードでComonadの「実際の」使用に注意することのボーナスポイント。

103
Dan Burton

これらのリンクは役に立つかもしれません:

  1. セルオートマトンの評価は共通語です 。特に、「多くの小さいが類似した計算から大きなデータ構造がつなぎ合わされたときはいつでも、私たちがコモナを扱っている可能性が十分にあります」。
  2. シーケンス、ストリーム、セグメント
  3. 日常生活のコナド
78
Alexey Romanov

これは私の質問に完全に答えているわけではありませんが、いくつかの関連情報を回答形式に入れたいと思いました。

「co」(大まかに)は「矢印を反転」を意味します。以下にその大まかなビジュアルを示します。

モナド演算を考えてください:

_return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)
_

波線の矢印を逆にすると、共通の操作が得られます。

_extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)
_

(通常の矢印で書かれています)

_extract :: w a -> a
extend :: (w a -> b) -> w a -> w b
_

このフォーマットでは、returnflip (>>=)の引数スロットにちょうど収まる矢印であり、extractextend。 Monad/comonadの法則では、returnまたはextractをそのスロットに入れると、結果は恒等矢印になります。法律は同じで、「矢印が反転しているだけ」です。それは非常に手ごわい答えですが、うまくいけばいくらかの洞察を提供します。

21
Dan Burton