computation
何らかの値を受け取って、そこから何らかの値を生み出すもの
Category型クラスやArrow型クラスの文脈で出てくる「計算」という概念のこと
紛らわしいのでcomputationと呼ぼうmrsekut.icon
日本語のArrow解説記事では「計算」と呼んでいるものが多い
computationの型
Category cat a b
catによって、aをbに変換する
この型の具体的な話はCategory型クラスを参照
computationであることの公理
以下の2つを満たす必要がある
恒等生
id . f == f . id == f
結合性
(f . g) . h = f . (g . h)
computationの具体例
普通の関数a -> b
catを(->)にしたもの
型エイリアスにすると、type Func a b = a -> b
Kleisli ma -> m b
「Kleisli arrow」などとも言う
アクションを返す関数のようなmrsekut.icon
catをモナドmにしたもの
型エイリアスにすると、type Kleisli m a b = a -> m b
非決定性a -> [b]
Kleisli mのmをListにしたもの
1つの入力に対し、複数の返り値がある
返り値が一つに決まらないのが「非決定性」
type NonDet a b = a -> [b]のような型
非決定性有限オートマトンのイメージでやってみたが逆にわからなくなったmrsekut.icon
状態変換(s,a) -> (s,b)
state transformers
Control.Monad.State.Lazy
sは状態
集合と考えて良い
スタックマシンのスタックに積んでいる要素の集合とかmrsekut.icon
型エイリアスにすると、type State s a b = (s, a) -> (s, b)
ref A New Notation for Arrows
写像変換(h -> a) -> (h -> b)
behaviour transformers
hを何とみなすかによって色々解釈できる
ある時刻tにおける値を返す
ある場所pにおける値を返す
ある状態sにおける値を返す
型エイリアスにすると、type MapTrans h b c = (h -> b) -> (h -> c)
ref Genuinely Functional User Interfaces
単純オートマトン
「単純オートマン(simple automata)」って一般的な名詞なの?
具体的に何を指しているのかわかっていないmrsekut.icon
newtype Auto a b = A(a -> (b, Auto a b)
https://qiita.com/CyLomw/items/3d65f14687148dc0556b
https://blog.jle.im/entry/auto-as-category-applicative-arrow-intro-to-machines
https://blog.jle.im/entry/intro-to-machines-arrows-part-1-stream-and
https://blog.jle.im/entry/auto-as-category-applicative-arrow-intro-to-machines.html
https://stackoverflow.com/questions/10516603/data-structure-to-represent-automata/10518678
https://www.reddit.com/r/haskell/comments/6mrcbj/encoding_objects_school_of_haskell/
hyperfunction
newtype Hyper b c = H (Hyper c b -> c)
Applicative FunctorF (b -> c)
stream transformersStream b -> Stream c
わからんmrsekut.icon
FRP的な文脈?
Fudgets-style stream processors
data SP a b = Put b (SP a b) | Get (a -> SP a b)
わからんmrsekut.icon
参考
Arrows: A General Interface to Computation
Examplesが載っている
各例に論文なども載っていて良い
『関数プログラミングの楽しみ』 10章
Arrowを理解する - Qiita