レンズ (ぶつかり稽古の没プレゼン)

27
レンズ

Upload: masahiro-honma

Post on 11-Jun-2015

805 views

Category:

Technology


0 download

DESCRIPTION

結局使わなかったプレゼンなので、どこかで話せれば。 (Japanese only)

TRANSCRIPT

Page 1: レンズ (ぶつかり稽古の没プレゼン)

レンズ @ FreakOuthiratara

Page 2: レンズ (ぶつかり稽古の没プレゼン)

自己紹介@hiratara圏論好き

モナモナ言うモナド入門Data::Monad

Page 3: レンズ (ぶつかり稽古の没プレゼン)

モナドの話しかしないおじさん?

Page 4: レンズ (ぶつかり稽古の没プレゼン)

Stop talking about monads

Page 5: レンズ (ぶつかり稽古の没プレゼン)

Talk about comonads

Page 6: レンズ (ぶつかり稽古の没プレゼン)

lens is costate comonad coalgebra

Page 7: レンズ (ぶつかり稽古の没プレゼン)

lensデータ構造の一部に注目オブジェクトのフィールドに注目セッターとゲッターの組

Page 8: レンズ (ぶつかり稽古の没プレゼン)

ネストするデータ構造name = commit.getAuthor().getName()commit.getAuthor().setName("hiratara")

Page 9: レンズ (ぶつかり稽古の没プレゼン)

イミュータブルの場合セッターは新しいインスタンスを返す。

author = commit.getAuthor()newAuthor = author.setName("hiratara")newCommit = commit.setAuthor(newAuthor)

Page 10: レンズ (ぶつかり稽古の没プレゼン)

lensnameというレンズの、set nameがセッター、get nameが

ゲッター。newAuthor = (set name) author "hiratara"

Page 11: レンズ (ぶつかり稽古の没プレゼン)

lensの合成合成演算を定義すれば、ネストした先のデータを簡単に更新

できる。newCommit = (set (name . author)) commit "hiratara"

name . authorは作者の名前に注目するレンズ。通常のフィールドと同じように値をセットできる。

Page 12: レンズ (ぶつかり稽古の没プレゼン)

様々な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: レンズ (ぶつかり稽古の没プレゼン)

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: レンズ (ぶつかり稽古の没プレゼン)

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: レンズ (ぶつかり稽古の没プレゼン)

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: レンズ (ぶつかり稽古の没プレゼン)

一方、 なる関手を と定義すると、米田の補題より、

: ³ 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: レンズ (ぶつかり稽古の没プレゼン)

 を とすれば、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: レンズ (ぶつかり稽古の没プレゼン)

co-とは「反対」という意味。ほとんどの場合はdualな概念。

(mathematics) of the opposite, of the counterpart

Page 19: レンズ (ぶつかり稽古の没プレゼン)

monadM �M MM

MM�

M

MMMM�

�M

MM�

MM � M

Page 20: レンズ (ぶつかり稽古の没プレゼン)

comonadW WW1W W1 W

W�

WWW WWW�

WW�W

W��

Page 21: レンズ (ぶつかり稽古の没プレゼン)

algebraと の組。X ! i0 h : MX ³ X ! i1

MMXMh

�X

MXh

MX h X

X �X MXh

X

Page 22: レンズ (ぶつかり稽古の没プレゼン)

coalgebraと の組。X ! i0 h : X ³ WX ! i1

WWX WXWh

WX�X

Xh

h

X WX1X

Xh

Page 23: レンズ (ぶつかり稽古の没プレゼン)

state monad積と冪の合成。

SMV = V ³ S × V= ((V ³ +) 1 (+ × V))S

Page 24: レンズ (ぶつかり稽古の没プレゼン)

costate comonad冪と積の合成。

SWV = (V ³ S) × V= ((+ × V) 1 (V ³ +))X

Page 25: レンズ (ぶつかり稽古の没プレゼン)

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: レンズ (ぶつかり稽古の没プレゼン)

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: レンズ (ぶつかり稽古の没プレゼン)

まとめLensの満たすべき性質はcomonad coalgebraの性質である

Twan van Laarhoven表現は米田の補題から導けるLenses are the coalgebras for the costate comonad

Lenses, Stores, and Yoneda