レンズ (ぶつかり稽古の没プレゼン)
DESCRIPTION
結局使わなかったプレゼンなので、どこかで話せれば。 (Japanese only)TRANSCRIPT
![Page 2: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/2.jpg)
自己紹介@hiratara圏論好き
モナモナ言うモナド入門Data::Monad
![Page 3: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/3.jpg)
モナドの話しかしないおじさん?
![Page 4: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/4.jpg)
Stop talking about monads
![Page 5: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/5.jpg)
Talk about comonads
![Page 6: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/6.jpg)
lens is costate comonad coalgebra
![Page 7: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/7.jpg)
lensデータ構造の一部に注目オブジェクトのフィールドに注目セッターとゲッターの組
![Page 8: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/8.jpg)
ネストするデータ構造name = commit.getAuthor().getName()commit.getAuthor().setName("hiratara")
![Page 9: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/9.jpg)
イミュータブルの場合セッターは新しいインスタンスを返す。
author = commit.getAuthor()newAuthor = author.setName("hiratara")newCommit = commit.setAuthor(newAuthor)
![Page 10: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/10.jpg)
lensnameというレンズの、set nameがセッター、get nameが
ゲッター。newAuthor = (set name) author "hiratara"
![Page 11: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/11.jpg)
lensの合成合成演算を定義すれば、ネストした先のデータを簡単に更新
できる。newCommit = (set (name . author)) commit "hiratara"
name . authorは作者の名前に注目するレンズ。通常のフィールドと同じように値をセットできる。
![Page 12: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/12.jpg)
様々な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の実装に近い
![Page 13: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/13.jpg)
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
![Page 14: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/14.jpg)
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
![Page 15: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/15.jpg)
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
![Page 16: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/16.jpg)
一方、 なる関手を と定義すると、米田の補題より、
: ³ 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
![Page 17: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/17.jpg)
を とすれば、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)は同値。
![Page 18: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/18.jpg)
co-とは「反対」という意味。ほとんどの場合はdualな概念。
(mathematics) of the opposite, of the counterpart
![Page 19: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/19.jpg)
monadM �M MM
�
MM�
M
MMMM�
�M
MM�
MM � M
![Page 20: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/20.jpg)
comonadW WW1W W1 W
W�
WWW WWW�
WW�W
W��
![Page 21: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/21.jpg)
algebraと の組。X ! i0 h : MX ³ X ! i1
MMXMh
�X
MXh
MX h X
X �X MXh
X
![Page 22: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/22.jpg)
coalgebraと の組。X ! i0 h : X ³ WX ! i1
WWX WXWh
WX�X
Xh
h
X WX1X
Xh
![Page 23: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/23.jpg)
state monad積と冪の合成。
SMV = V ³ S × V= ((V ³ +) 1 (+ × V))S
![Page 24: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/24.jpg)
costate comonad冪と積の合成。
SWV = (V ³ S) × V= ((+ × V) 1 (V ³ +))X
![Page 25: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/25.jpg)
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
![Page 26: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/26.jpg)
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
![Page 27: レンズ (ぶつかり稽古の没プレゼン)](https://reader034.vdocuments.mx/reader034/viewer/2022052506/55795bfdd8b42ab6648b4f4d/html5/thumbnails/27.jpg)
まとめLensの満たすべき性質はcomonad coalgebraの性質である
Twan van Laarhoven表現は米田の補題から導けるLenses are the coalgebras for the costate comonad
Lenses, Stores, and Yoneda