はわわーっ

はわわわわっ

Lensにさわってみた

Lensをちょっと触ってみた。
詳しく知らないけど、getterとかsetterとかオブジェクト指向的なことができるライブラリらしい。
ekmett/lens · GitHubのREADMEに書いてたものの一部ををそのまま実行しただけ。

まず、インポートする。

> import Control.Lens

getterをつかってみる。

> ("hello", "world")^._2
"world"
> ("hello", ("world", "!!!"))^._2._1
"world"
> view _2 (10, 20)
20

(^.)がgetter的なもので(_1)とか(_2)とかでタプルのn番目の要素にアクセスできる。
viewは(^.)の前置記法。

次、setter。

> set _2 42 ("hello", "world")
("hello",42)
> set (_2._1) 42 ("hello", ("world", "!!!"))
("hello",(42,"!!!"))
> _1 .~ "hello" $ ((), "world")
("hello","world")

setterはsetを使う。(.~)はsetの中置記法。

toを使うとgetterで取り出した値に関数を適用できる。

> "hello"^.to length
5
> ("hello", ("world", "!!!"))^._2._2.to length
3

あとはsetterにmappedってのもある。overはfmapみたいなものらしい。(%~)はoverの中置記法。

> over mapped succ [1,2,3]
[2,3,4]
> over (mapped._2) succ [(1,2), (3,4)]
[(1,3),(3,5)]
> mapped._2 %~ succ $ [(1,2), (3,4)]
[(1,3),(3,5)]
> _1.mapped._2.mapped %~ succ $ ([(42, "hello")], "world")
([(42,"ifmmp")],"world")

なんかサンプル実行してみたけどよくわからん。