HaskellのComonadタイプクラスとは何ですか? comonadパッケージのControl.Comonad からのComonadのように(Comonadタイプクラスを提供する他のパッケージの説明も歓迎します)。私は漠然とComonadについて聞いたことがありますが、それについて本当に知っているのは、それがextract :: w a -> a
、モナドのreturn :: a -> m a
。
「実際の」コードでComonadの「実際の」使用に注意することのボーナスポイント。
これらのリンクは役に立つかもしれません:
これは私の質問に完全に答えているわけではありませんが、いくつかの関連情報を回答形式に入れたいと思いました。
「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
_
このフォーマットでは、return
はflip (>>=)
の引数スロットにちょうど収まる矢印であり、extract
とextend
。 Monad/comonadの法則では、return
またはextract
をそのスロットに入れると、結果は恒等矢印になります。法律は同じで、「矢印が反転しているだけ」です。それは非常に手ごわい答えですが、うまくいけばいくらかの洞察を提供します。