Lens&Prism勉強会 私的まとめ
by Yuji Yamamoto on June 9, 2015
もう開催から1週間以上経ってしまいましたが、Lens&Prism勉強会に行ってきたのでそのまとめ記事です。
当日しこしことっていたメモと記憶を頼りに、発表内容や個人的な気付きなどを書きます。
@gakuzzzzさんの「Lensの説明」
connpassには別のスライドが貼ってありますが、実際の中身はBeyond Scala Lensというスライドの日本語での解説でした。
要約するとこんな感じの表に収まるのですかね。 スライドではScalaでの呼び名で説明されてましたが、ここでは私向けにHaskellに訳しています。
-- 全てのsをaに変換でき、かつ全てのaをsに変換できる関数のペア
Iso' s a: f :: s -> a, g :: a -> s
-- 全てのsからaに変換できるわけではないが、aからsには変換できる関数のペア
Prism' s a: f :: s -> Maybe a, g :: a -> s
-- 全てのsをaに変換でき、sの一部をaで書き換えたsを作れる関数のペア
Lens' s a: f :: s -> a, g :: (s, a) -> s
-- 上記2つの特徴を併せ持つ。
-- Traversalと異なるのは、aを取得した結果が "zero or one" である点?(ここよくわかってない)
Affine Traversal' s a: f :: s -> Maybe a, g :: (s, a) -> s
ちなみに、lensやScalaのMonocleが提供する、LensやIso, Prismなどの型の総称を「Optic」と呼ぶそうです。
@its_out_of_tuneさんの「LensでHaskellをもっと格好良く!」
以前のekmett勉強会でやった内容の復習。
HaskellのLensの使い方、仕組みをわかりやすく総ざらいしてくれます。
lensライブラリ全体ではなく各種Opticのうち、Lensに特化した内容となっております。
@its_out_of_tuneさんの「Opticから見たLens/Prism」
前の発表からの引き続き。
HaskellのlensライブラリはMonocleと違って、各種Opticは全部↓の
type Optic p f s t a b = p a (f b) -> p s (f t)
にちょっとずつ制約を加えただけのバージョンなんだぜ!
例えば、Prism
はp
にChoice
, f
にApplicative
の制約を加えただけなんだぜ!
というお話。
その後はその詳細についてでしたが、正直この時はIRCやらタイムラインやらに夢中になり、あまり内容を覚えておりません…。
@halcat0x15aさんの「DERIVING LENSES」
Haskellでいうところの
data Lens s a = Lens { get :: s -> a, set :: s -> a -> s }
な定義のLens、つまりScalaのMonocleの定義に近いLensを
Java・Scala・Haskellそれぞれのメタプログラミングで自動生成する話でした。
Javaでできちゃうこととか面白かったです(小並感)。
…だけでなく、本題とそれますが、Scala風のLensの定義はHaskellのと違って
「全部1種類の関数(Optic)から定義できるんだぜ!」みたいなかっこよさは欠けるものの、
「Lensはgetとsetができるんだぜ!」とか、
「IsoはgetとreverseGetができるんだぜ!」、
みたいなことが2秒でわかるので、これはこれでわかりやすくていいですね。
@tanakhさんの 「XPath in Lens」
xml-lensの話。
lensは広く知られて、広く使われているので、lensでXMLも扱っちゃえば、変なクエリ言語を新しく覚える必要もなく、つぶしが効いていいよ!やっぱりLensはデータ構造のjQueryだ!
@fumievalさんの「ちょっぴり危険なLensのヒミツ」
unsafeCoerce
: 実質同じ型(newtypeとか)を強制変換(変換処理の削除)することで最適化を図れる。- GHC 7.8以降はより安全な
coerce
(型から自動的に強制変換できるか判定する?)が使える。
- GHC 7.8以降はより安全な
views
もover
もreview
も突き詰めると実質「NOOP」なのでunsafeCoerce
(またはcoerce
)だけで定義できちゃうw- そしてekmett氏のlens内部でも積極的にそれを活用しているのでekmett氏のlensは高速に動くという、背筋が凍るようで凍らない安心できる怖い話。
@fumievalさんの「LensにもPrismにもなるフィールド」
- LensもPrismも結局全部Opticなんで意外と簡単に抽象化できた。
- そしたらファーストクラスパターンマッチなるものもできたよマジやばそう。
@AoiroAoinoさんの「Monocleとかいうのがありまして」
Monocle利用体験談。
Javaのライブラリを包むときにPrismが便利かも!
以上!
途中からかなり雑になってしまいましたが、まぁ私が理解できなかったり眠かったりと、いろいろ大人の事情があるのでどうかこの辺でご容赦ください。
何はともあれ主催の@pocketberserkerさんはじめ準備や楽しいお話をありがとうございました!
Lens使ったことない自分も十分楽しめました!
Haskell周りはずっとインプットばっかりなんで、Lens使うなりしてそろそろもっとアウトプットしたいですね!