LoginSignup
3
3

More than 5 years have passed since last update.

Control.Lens

Posted at

Lensはゲッターとセッターが一緒になったもの。フィールド名だと思ってもいい。makeLensesを使えば自分で定義した型のLensを作ってくれて便利。Lensをゲッターとして使いたければ^.、セッターとして使いたければ.~を使うと良い。age .~ 36は年齢を36に変更する関数で、Man -> Manになっている。

% runghc
{-# LANGUAGE TemplateHaskell#-}
import Control.Lens

data Man = Man { _name :: String, _age :: Int } deriving (Show, Eq, Ord)
emptyMan :: Man
emptyMan = Man { _name = "", _age = 0 }
makeLenses ''Man

main :: IO ()
main = do
  print $ hiratara ^. age
  putStrLn $ hiratara ^. name
  return ()
  where hiratara = (age .~ 36) . (name .~ "hiratara") $ emptyMan

結果。

36
hiratara

MonadStateに閉じ込めて使いたければ use.=を使うとよい。

import Control.Lens
import Control.Monad.Trans
import Control.Monad.Trans.State

...

main :: IO ()
main = flip evalStateT emptyMan $ do
  age .= 30
  name .= "hiratara"
  lift . print =<< use age
  lift . putStrLn =<< use name
  return ()
3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3