Lens
データへアクセスする方法、普通にやるよりかなり簡単に書けるようになる。
タプル
一般的には2タプル程度しか使わないので fst や snd で間に合うのですが、データベースのテーブルをJOINしたりして、取得するデータ構造は果てしないタプルになって出力されてくるので、そういうときにかなり重宝します。
import Control.Lens
main :: IO ()
= do
main let val = (1, "2", 3) :: (Int, String, Int)
putStrLn $ show $ (val ^. _1)
putStrLn $ show $ (val ^. _2)
putStrLn $ show $ (val ^. _1)
putStrLn $ show $ (val &_2 .~ "Hello")
putStrLn $ show val
実行すると
shell > runghc LensTouple.hs
1
"2"
1
(1,"Hello",3)
(1,"2",3)
こんな感じで直撃で取得できます。
データ型
data型を定義する際に、フィールドラベルを **_** (アンダースコア)ではじめておいて、その後 makeLenses という宣言を行うことで利用できるようになります。 makeLenses を利用するには {-# LANGUAGE TemplateHaskell #-} 拡張を有効にする必要があるようです。
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data Emperor = Emperor
{ _version :: Double
_name :: String
, _hobby :: String
,deriving(Show, Eq)
}
'Emperor
makeLenses '
main :: IO ()
= do
main let foo = Emperor 2.0 "Yoshida" "盆栽"
putStrLn $ show(foo^.version)
putStrLn $ foo^.name
putStrLn $ foo^.hobby
実行してみると
shell > runghc LensDataType.hs
2.0
Yoshida
盆栽
という感じでデータの値にアクセス出きるようになる。
Posted on 2021-09-20 15:14:22