Lens
データへアクセスする方法、普通にやるよりかなり簡単に書けるようになる。
タプル
一般的には2タプル程度しか使わないので fst や snd で間に合うのですが、データベースのテーブルをJOINしたりして、取得するデータ構造は果てしないタプルになって出力されてくるので、そういうときにかなり重宝します。
import Control.Lens
main :: IO ()
main = do
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)
makeLenses ''Emperor
main :: IO ()
main = do
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
