レンズ (ぶつかり稽古の没プレゼン)
DESCRIPTION
結局使わなかったプレゼンなので、どこかで話せれば。 (Japanese only)TRANSCRIPT
レンズ @ FreakOuthiratara
自己紹介@hiratara圏論好き
モナモナ言うモナド入門Data::Monad
モナドの話しかしないおじさん?
Stop talking about monads
Talk about comonads
lens is costate comonad coalgebra
lensデータ構造の一部に注目オブジェクトのフィールドに注目セッターとゲッターの組
ネストするデータ構造name = commit.getAuthor().getName()commit.getAuthor().setName("hiratara")
イミュータブルの場合セッターは新しいインスタンスを返す。
author = commit.getAuthor()newAuthor = author.setName("hiratara")newCommit = commit.setAuthor(newAuthor)
lensnameというレンズの、set nameがセッター、get nameが
ゲッター。newAuthor = (set name) author "hiratara"
lensの合成合成演算を定義すれば、ネストした先のデータを簡単に更新
できる。newCommit = (set (name . author)) commit "hiratara"
name . authorは作者の名前に注目するレンズ。通常のフィールドと同じように値をセットできる。
様々なlensの実装1. Lens {get :: s -> v, set :: s -> v -> s}
直感的2. s -> (v, v -> s)
costate comonad coalgebra3. Functor f => (v -> f v) -> s -> f s
Haskellのlensの実装に近い
1. と 2.の関係1. Lens {get :: s -> v, set :: s -> v -> s}2. s -> (v, v -> s)3. Functor f => (v -> f v) -> s -> f s
2.は直積<get, set>であり、同値。
sget
<get,set>set
v (v, v ³ s)f st sndv ³ s
2. と 3.の関係1. Lens {get :: s -> v, set :: s -> v -> s}2. s -> (v, v -> s)3. Functor f => (v -> f v) -> s -> f s
米田の補題を二回使うことで同値。(i(X,+), F) ^ FXSetsi
ii(X,+)
FSets
XとしてVを用いると、
積と冪が随伴の関係であることから、
任意の関手 について、 なる関手を考えると米田の補題より、
F : i ³ Sets X Ç V ³ FX
(i(X,+), V ³ F+) ^ V ³ FXSetsi
(i(V,+), V ³ F+) ^ V ³ FVSetsi
(V × i(V,+), F) ^ V ³ FVSetsi
一方、 なる関手を と定義すると、米田の補題より、
: ³ SetsäS Setsi G = GSäS
( (G,+), )SetsSetsi Setsi äS
( (G,+),+(S))SetsSetsi Setsi^ GäS
^ GSGとして、 なる関手を用いれば、X Ç V × (V ³ X)
( (V × (V ³ +),+),+(S)) ^ V × (V ³ S)SetsSetsi Setsi
を とすれば、i Sets( (V × Sets(V,+),+),+(S)) ^ V × (V ³ S)SetsSetsSetsSetsSets
先に示しておいた関係により、(V ³ +(V),+(S)) ^ V × (V ³ S)SetsSetsSets
つまり、Functor f => (v -> f v) -> f sと(v, v->s)は同値。
co-とは「反対」という意味。ほとんどの場合はdualな概念。
(mathematics) of the opposite, of the counterpart
monadM �M MM
�
MM�
M
MMMM�
�M
MM�
MM � M
comonadW WW1W W1 W
W�
WWW WWW�
WW�W
W��
algebraと の組。X ! i0 h : MX ³ X ! i1
MMXMh
�X
MXh
MX h X
X �X MXh
X
coalgebraと の組。X ! i0 h : X ³ WX ! i1
WWX WXWh
WX�X
Xh
h
X WX1X
Xh
state monad積と冪の合成。
SMV = V ³ S × V= ((V ³ +) 1 (+ × V))S
costate comonad冪と積の合成。
SWV = (V ³ S) × V= ((+ × V) 1 (V ³ +))X
costate comonad coalgebraS ³ S = S ³ ((V ³ S) × V)WV
data CoState v s = CoState (v -> s) v
class Comonad w where extract :: w s -> s duplicate :: w s -> w (w s)
instance Comonad (CoState s) where --extract :: (v -> s, v) -> s extract (CoState f v) = f v --duplicate :: (v -> s, v) -> (v -> (v -> s, v), v) duplicate (CoState f v) = CoState (\u -> CoState f u) v
-- s -> (v -> s, v)type Lens s v = s -> CoState v s
Lensが満たす性質comonad、coalgebraの定義から、以下が成り立つ。
set l s (get l s)get l (set l s v)
set l (set l s v) u
= s= v= set l s u
まとめLensの満たすべき性質はcomonad coalgebraの性質である
Twan van Laarhoven表現は米田の補題から導けるLenses are the coalgebras for the costate comonad
Lenses, Stores, and Yoneda