Lens&Prism勉強会 私的まとめ

by Yuji Yamamoto on June 9, 2015

Tagged as: Haskell, Scala, 圏論.

もう開催から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)

ちょっとずつ制約を加えただけのバージョンなんだぜ!
例えば、PrismpChoice, fApplicativeの制約を加えただけなんだぜ!
というお話。

その後はその詳細についてでしたが、正直この時は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のヒミツ」

@fumievalさんの「LensにもPrismにもなるフィールド」

@AoiroAoinoさんの「Monocleとかいうのがありまして

Monocle利用体験談。
Javaのライブラリを包むときにPrismが便利かも!

以上!

途中からかなり雑になってしまいましたが、まぁ私が理解できなかったり眠かったりと、いろいろ大人の事情があるのでどうかこの辺でご容赦ください。

何はともあれ主催の@pocketberserkerさんはじめ準備や楽しいお話をありがとうございました!
Lens使ったことない自分も十分楽しめました!
Haskell周りはずっとインプットばっかりなんで、Lens使うなりしてそろそろもっとアウトプットしたいですね!


I'm a Haskeller Supported By Haskell-jp.