Arrow型クラス
John Hughesによって定義された
Generalising monads to arrowsが初出論文
computationを圏論の文脈で呼ぶと射(arrow)となる
なので、>>>は「computationとcomputationの合成」と言っても、「arrowとarrowの合成」と言っても正しい
Monadの一般化
全てのモナドはArrowに変換できる
モナドで済む場合は、モナドを使うべき
モナドに似ているが、モナドではないときはArrowを使えばいい
docs
図で理解するArrow
ノリだけ思い出したければこれを読めばいいmrsekut.icon
Arrow記法
CategoryとArrowと圏論
関数を計算に変換する機能と 2 つの計算を並列に実行する計算を作る機能を兼ね備えたのが Arrow クラス
つまり、Category型クラス+並行計算?
Category型クラスを継承する必要がる
Monad型クラスの一般化
複数の入力を消費できる
入力値による選択が行える
フィードバックが可能である
定義
code:hs
class Category h => Arrow h where
-- 関数を計算へ持ち上げ
arr :: (a -> b) -> h a b
(***) :: h a b -> h c d -> h (a, c) (b, d)
first :: h a b -> h (a,c) (b,c)
first = (*** id)
second :: h a b -> h (c,a) (c,b)
second = (id ***)
arr
***
first
first f = f *** idと同じ
firstの公理 ref
よくわかっていないmrsekut.icon
code:hs
first (arr f) = arr (f >< id) -- 拡張
first (f >>> g) = first f >>> first g -- 関手
first f >>> arr (id >< g) = arr (id >< g) >>> first f -- 交換
first f >>> arr fst = arr fst >>> f -- 単位
first (first f) >>> arr assoc = arr assoc first f -- 結合
seocnd
second = (id ***)と同じ
ミニマムな定義
上の定義では、***とsecondも個別に定義しているが、
arrとfirstがあれば実装できる
code:hs
second :: h b c -> h (d, b) (d, c)
seconf f = (arr swap) . (first f) . (arr swap)
where swap ~(x, y) = (y, x)
(***) :: h b c -> h b' c' -> h (b, b') (c, c')
f *** g = (first f) . (second g)
&&&も定義されている
計算に適用する前に入力を複製する
code:hs
(&&&) :: h a b -> h a b' -> h a (b,b')
f &&& g = arr (\b -> (b,b)) >>> f *** g
インスタンス
普通の関数(->)
code:hs
instance Arrow (->) where
arr f = f
(***) f g ~(x,y) = (f x, g y)
Kleisli m ref
code:hs
instance Monad m => Arrow (Kleisli m) where
-- 関数を計算へ持ち上げ
arr :: (a -> b) -> (a -> m b)
arr f = return . f
-- 計算を並列実行する計算を作成
(***) :: (a -> m b) -> (c -> m d) -> ((a, c) -> m (b, d))
f *** g = \(x, y) -> do {s <- f x; t <- g y; return (s, t)}
使用例
普通の関数(->)
code:hs
plus1 = (+1)
double = (*2)
(plus1 *** double) (10,10) -- >> (11,20)
first plus1 (10,10) -- >> (11,10)
second double (10,10) -- >> (10,20)
HXT
Arrowを継承した型クラス
ArrowChoice型クラス
ArrowLoop型クラス
ArrowApply型クラス
ArrowMonad
#??
いつ嬉しい?
タプルってそんな使わなくね?という気持ちがあるが、そんなに嬉しいのか?
ユースケース
HaskellでBrainfuck処理系#5f96e20319827000001ada57
HXT
Arrowを理解する - Qiita
http://blog.kzfmix.com/entry/1266020345
https://gist.github.com/PhilOwen/88671dfa2e645fe9e7763a2647b0f934
https://qiita.com/Lugendre/items/6b4a8c8a9c85fcdcb292#使ってみる
参考
Category と Arrow — Avendia
最初に読むのにすごく良い
『関数プログラミングの楽しみ』 10章
敢えて関数名とか定義とずらしているんだろうけど、逆に混乱を招く感じもするmrsekut.icon
Arrowを理解する - Qiita
『関数プログラミングの楽しみ』10章の内容から取ってきている
Categoryの(.)など(記事内では>>>)が微妙に型がズレているので注意mrsekut.icon
https://its-out-of-tune.hatenadiary.org/entry/20120108/1326279515
https://stackoverflow.com/questions/4191424/what-are-arrows-and-how-can-i-use-them
Programming with Arrows
http://www.cse.chalmers.se/~rjmh/afp-arrows.pdf
https://en.wikipedia.org/wiki/Arrow_(computer_science)
https://haxis-fx.hatenadiary.org/entry/20110720/1311149995
https://haxis-fx.hatenadiary.org/entry/20110726/1311657175
不動点
https://qiita.com/CyLomw/items/688942f19a5bc3a25037
https://r-west.hatenablog.com/entry/20070720/1184946510
https://jaspervdj.be/posts/2020-03-12-visual-arrow-syntax.html
https://homepages.inf.ed.ac.uk/wadler/topics/monads.html
https://www.tweag.io/blog/2021-04-15-arrows-through-a-different-lens/
arrowとLens