今日は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の比較OptionalorTravarsal, 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 さん
- タプルの
setgetは普通めんどい →lens ^._1get ,_2.~set,&(flip ($))makeLensesTemplate Haskell- lensの作り方
TraversableのfmapDefault,over, とSetterData.FoldableのfoldMapとfoleMapOf,GettingSetterとGettingをFunctorを使ってそろえる- 便利な使い方
%~はovertoは関数適用。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とLensPrismからReview、さらにAReviewへ。unto,un,reunto,un→Reviewを作るre→Getterを作る
GettingはGetter、SetterはSettableFoldはGetterとTraversalを強くしたもの(^..),(^?)Getting r s aのrがMonoidならFold
ChoiceとPrismChoiceはProfunctor。関数とTaggedPrismはprism関数で作る
Const rはMonoid制約がないとApplicativeにならないpureの定義にmempty必要
- Q. 「準同型」の言葉が違う、
Const rの定義が実際と違う (mappend使う)
DERIVING LANSES / halcat0x15a さん
- Lensを手で作るのは辛い
- JavaでReflection
- Java8でパラメータ名をReflectionで取れる
- コンストラクタからパラメータ名を取ってゲッターの名前を作ってとる
- (めっちゃ辛い)
- Scala のマクロによるlens
- マクロ:ブラックボックスとホワイトボックス
- →強力な方(ホワイトボックス)
- フィールド名が存在しなくてもコンパイル時に弾かれる
- 型安全かつ速い。ただしホワイトボックスマクロは将来なくなるかも
- HaskellのGeneric
GHC.GenericGenericクラスは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-lensVSlens-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っぽくも書ける