今日はLens&Prism勉強会の日です

Lens&Prism勉強会に途中から来ています。

Lensの説明 / gakuzzzzさん

途中から。

  • lensは部分から構成
  • ekmett さん「set l (set l s b) a == set l s bが抜けてるよ」
  • ネストされた設定の例
  • At マップのキーバリューから値を取り出す
  • Iso, Prism, Lens について、 f, g の比較
  • Optional or Travarsal, Affine Traversal, 0-1 Traversal などの呼び方
    • PrismLensを合わせたもの
  • IndexAt の違い
    • 存在しないインデックスだと部分が取り出せない
  • Json の例
    • String からの変換から始まってひたすらネストが必要
    • parsePrismではダメ。JSONの表記ゆれがあるから元に戻せない
      • Optional を使う
      • ekmettさんによると、表記ゆれを同値と見なすこともできるのであってるともあってないとも言える
    • LensよりOptionalPrismが使われてる
  • 他に Getter とか Setter とかある
  • Q. Scalaで使ってうれしいの?
    • そんなに頻繁にはない
    • 手で書くとそんなにコード短くならない。マクロ使えれば嬉しいかも
  • Q. ScalaZMonocleとで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の作り方
  • TraversablefmapDefault, over, と Setter
  • Data.FoldablefoldMapfoleMapOf, Getting
  • SetterGettingFunctor を使ってそろえる
  • 便利な使い方
  • %~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
    • IntSum を使えばモノイドになるよ!
  • Functor いろいろ
    • Contravariant 反変。HomとかConstとか
    • Bifunctor 双関手
    • Profunctor
  • Optic : Lens から (->) を抽象化
    • Prism も表現できる
    • Optical : (->) を 1 種類から 2 種類に増やしたもの
  • ekemett/lens はすべて Optic 型で全て合成可能
    • 後はコンパイラお任せ
  • Equality : id のみ
  • Iso : 同型。 from で逆にできる
  • Iso から PrismLens
    • Prism から Review 、さらに AReview へ。 unto, un, re
    • unto, unReview を作る
    • reGetter を作る
  • GettingGetterSetterSettable
  • FoldGetterTraversal を強くしたもの
    • (^..), (^?)
    • Getting r s arMonoid なら Fold
  • ChoicePrism
    • ChoiceProfunctor。関数とTagged
    • Prismprism 関数で作る
  • Const rMonoid 制約がないと 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 にしてる点が違う

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 VS lens-aeson
    • 前者を tanakh さんが更新しないから ekmett さんが作ったのが後者
  • Q. xml-lens の作者だけど何かある?
    • 属性があるかないか書きにくい
    • 足します
  • Q. CSSセレクタからレンズを作る機能があるとすごい
    • 作ると面白いと思います

ちょっぴり危険なLensのヒミツ / fumieval さん

  • newtype はオーバーヘッドがない (NOOP)
    • unsafeCoerce で書ける (型を強引に変える)
    • ルールはある。さまざまな変換でNOOPを保存する
    • #. は効率よく引数をはがしたりできる
  • lensの特徴の3つの操作
    • views : .# を使っていて、NOOPになる
    • over : 同じく NOOP
    • review : 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っぽくも書ける