今日はLens&Prism勉強会の日です
Posted on May 30, 2015
Tweet
Lens&Prism勉強会に途中から来ています。
Lensの説明 / gakuzzzzさん
途中から。
- lensは部分から構成
- ekmett さん「
set l (set l s b) a == set l s b
が抜けてるよ」 - ネストされた設定の例
At
マップのキーバリューから値を取り出すIso
,Prism
,Lens
について、f
,g
の比較Optional
orTravarsal
, Affine Traversal, 0-1 Traversal などの呼び方Prism
とLens
を合わせたもの
Index
とAt
の違い- 存在しないインデックスだと部分が取り出せない
Json
の例String
からの変換から始まってひたすらネストが必要parse
はPrism
ではダメ。JSONの表記ゆれがあるから元に戻せないOptional
を使う- ekmettさんによると、表記ゆれを同値と見なすこともできるのであってるともあってないとも言える
Lens
よりOptional
とPrism
が使われてる
- 他に
Getter
とかSetter
とかある - Q. Scalaで使ってうれしいの?
- そんなに頻繁にはない
- 手で書くとそんなにコード短くならない。マクロ使えれば嬉しいかも
- Q.
ScalaZ
とMonocle
とでPLens
は違う- Partial LensとPolymorphic Lens
- HaskellだとLensはレンズファミリー、
Lens'
がレンズ - ScalaのPartial LensはHaskellでは
Traversal
では(怪しげ)
LensでHaskellをもっと格好良く! / its_out_of_tune さん
- タプルの
set
get
は普通めんどい →lens
^.
_1
get ,_2
.~
set,&
(flip ($)
)makeLenses
Template Haskell- lensの作り方
Traversable
のfmapDefault
,over
, とSetter
Data.Foldable
のfoldMap
とfoleMapOf
,Getting
Setter
とGetting
をFunctor
を使ってそろえる- 便利な使い方
%~
はover
to
は関数適用。getterになるuse
と.=
はMonadState
で使う
Opticから見たLens/Prism / its_out_of_tune さん
Either
が入るとLens
ではきつい^?
:Prism
での値の取り出し- setterは一緒
Monoid
の取り出しではmempty
があるので一緒
Prism
も合成可能。Lens
と合成するとre
は使えないMonadState
内でも普通に使える- ただし、
use
はMonoidのみ。preuse
Int
はSum
を使えばモノイドになるよ!
- ただし、
Functor
いろいろContravariant
反変。HomとかConstとかBifunctor
双関手Profunctor
Optic
:Lens
から(->)
を抽象化Prism
も表現できるOptical
:(->)
を 1 種類から 2 種類に増やしたもの
- ekemett/lens はすべて
Optic
型で全て合成可能- 後はコンパイラお任せ
Equality
:id
のみIso
: 同型。from
で逆にできるIso
からPrism
とLens
Prism
からReview
、さらにAReview
へ。unto
,un
,re
unto
,un
→Review
を作るre
→Getter
を作る
Getting
はGetter
、Setter
はSettable
Fold
はGetter
とTraversal
を強くしたもの(^..)
,(^?)
Getting r s a
のr
がMonoid
ならFold
Choice
とPrism
Choice
はProfunctor
。関数とTagged
Prism
はprism
関数で作る
Const r
はMonoid
制約がないとApplicative
にならないpure
の定義にmempty
必要
- Q. 「準同型」の言葉が違う、
Const r
の定義が実際と違う (mappend
使う)
DERIVING LANSES / halcat0x15a さん
- Lensを手で作るのは辛い
- JavaでReflection
- Java8でパラメータ名をReflectionで取れる
- コンストラクタからパラメータ名を取ってゲッターの名前を作ってとる
- (めっちゃ辛い)
- Scala のマクロによるlens
- マクロ:ブラックボックスとホワイトボックス
- →強力な方(ホワイトボックス)
- フィールド名が存在しなくてもコンパイル時に弾かれる
- 型安全かつ速い。ただしホワイトボックスマクロは将来なくなるかも
- HaskellのGeneric
GHC.Generic
Generic
クラスはderiving可能- 名前の取り出し方がわからないので何番目のフィールドか
- → 型レベル自然数が必要
- 型安全、マクロ不要、遅い
- Q.
Deriving Generic
する? → ライブラリとかよろしく使ってくれる。JSONとか - Q.
lens
にもGeneric
あるよね? →Generic
に対するISO
があるだけでは- Genericのインスタンスについて
Traversal
にする仕組みはある - この仕組みはフィールドを明示して
Lens
にしてる点が違う
- Genericのインスタンスについて
XPath in Lens / tanakh さん
- ブラウザを開かずにAsk.fmで質問したい
xml-conduit
でADT取り出して直接も書けるText.XML.Cursor
を使えばいい → パッケージごとにDSL覚えるのはちょっとText.XML.Lens
:..
とか./
とかきついけど広く使われてる- そして
Lens
沼へ - XPATHと
Lens
の対比表 → 結構違う - 「無尽蔵に演算子が増える」
- CSSセレクターも使える
- XPathよりナウい。「題材を間違えた感」
http-condit
と組み合わせると楽aeson-lens
VSlens-aeson
- 前者を tanakh さんが更新しないから ekmett さんが作ったのが後者
- Q.
xml-lens
の作者だけど何かある?- 属性があるかないか書きにくい
- 足します
- Q. CSSセレクタからレンズを作る機能があるとすごい
- 作ると面白いと思います
ちょっぴり危険なLensのヒミツ / fumieval さん
newtype
はオーバーヘッドがない (NOOP)unsafeCoerce
で書ける (型を強引に変える)- ルールはある。さまざまな変換でNOOPを保存する
#.
は効率よく引数をはがしたりできる
- lensの特徴の3つの操作
views
:.#
を使っていて、NOOPになるover
: 同じく NOOPreview
: NOOP- つまり全部
unsafeCoerce
で定義するだけでO.K.
- よってすっげー速い
- プログラムを速くしたいときは
unsafeCoerce
- 7.8 から入った
coerce
でもよい。型から安全課判断してくれる
LensにもPrismにもなるフィールド(仮称) / fumieval さん
今朝、スライドデータを吹っ飛ばしたとのことです。
- フィールドをlensでもprismでも使う
- 漢字変数ははGHCだと大文字になるので注意
- Q. どうしてこういう発想に?
- パターンマッチをしたいから。名前をまとめたかった
Monocleとかいうのがありまして / AoiroAoinoさん
- BSON : MongoDBなどで利用。Binary JSON
- Javaのドライバ使うとすごくJavaっぽくなる
- Prismを定義する。Immutableに扱える
- 「あんまり顔文字に見えない演算子」でHaskellっぽくも書ける