Comonad型クラス
圏論については、コモナド
定義例
code:hs
class Functor w => Comonad w where
extract :: w a -> a
duplicate :: w a -> w (w a)
extend :: (w a -> b) -> w a -> w b
wを使ってるのはmをひっくり返してるだけmrsekut.icon
extract
duplicate
extend
#WIP
雑に理解
extract
selectorのようなやつ
Comonadic User Interfacesではcomponentの感じでstateからviewを計算する
dupulicate
コモナド自身の未来を写し出す関数
現在のcomonad、複製して一部の状態を変更したもの、それをさらに一部変更したもの、、、、の集合
Comonadが取りうる状態空間
例
code:hs
data Stream a = Cons a (Stream a)
instance Functor Stream where
fmap f (Cons x xs) = Cons (f x) (fmap f xs)
instance Comonad Stream where
extract (Cons x _) = x
duplicate s@(Cons _ xs) = Cons s (duplicate xs)
extract
Streamの先頭を取り出す
duplicate
リスト全体をシフトした新しいリストを作る
こういうStreamがあるとすると
code:hs
s = Cons 1 (Cons 2 (Cons 3 (Cons 4 ... )))
こんな感じ
code:hs
duplicate s = Cons s (Cons (tail s) (Cons (tail (tail s)) (Cons (tail (tail (tail s))) ... )))
擬似的に書くと
code:hs
duplicate s = Cons 1,2,3,4... (Cons 2,3,4,... (Cons 3,4,... ...))
「コモナドはモナドの圏論的双対」ですとか、有名なモナドに対応するコモナドがあるんですね。Reader、Writer、StateにはEnv、Traced、Storeみたいに対応してたり、みんな大好きZipperもコモナドのインスタンスだったりします。Lensっていうやつは、余状態余モナドの余代数、みたいな……(笑)ref
Envコモナド
https://pursuit.purescript.org/packages/purescript-transformers/5.1.0/docs/Control.Comonad.Env
https://blog.functorial.com/posts/2016-08-07-Comonads-As-Spaces.html
https://its-out-of-tune.hatenadiary.org/entry/20130413/1365837949
https://qiita.com/lotz/items/fbc4788b8ea8313cbf76
https://logmi.jp/tech/articles/320969
https://gitlab.com/homotopic-tech/within
https://twitter.com/igrep/status/1420937751734538245
https://www.slideshare.net/RuiccRail/purescript-with-monad-altjs
https://bartoszmilewski.com/2017/01/02/comonads/
https://functorial.com/the-future-is-comonadic/main.pdf
Phil Freeman
https://kodimensional.dev/posts/2019-03-25-comonadic-builders
https://jordanmartinez.github.io/purescript-jordans-reference-site/content/91-Type-Classes/External-Explanations.html
@lotz84_: コモナドは直感的には"基点付き空間"と考えられるという解説記事。空間は可能な状態の集合により形成されており extract によって現在の状態を取り出すことが出来る。コモナドを使ったUIの実装を交えて解説されている/
Comonads as Spaces
https://blog.functorial.com/posts/2016-08-07-Comonads-As-Spaces.html
https://twitter.com/lotz84_/status/1642118651213123585