Lensを使うぜ!

パッケージをインストールするぜ!そしてさっそくghciを起動するぜ!

$ cabal install lens
$ ghci
GHCi, version 7.6.3: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> import Control.Lens
Prelude Control.Lens> 

タプルから値を取り出すぜ!

> (1,1,4,5,1,4) ^. _3
4

リストの要素も取り出せるぜ!勿論範囲外の値は取れないけどな!

> [1,1,4,5,1,4] ^? ix 2
Just 4

> [1,1,4,5,1,4] ^? ix 6
Nothing

_3ix 2の部分がLens(正確に表現すれば、後者はLensの特殊な場合)だぜ!

リストやタプルの要素を書き換えることもできるぜ!

> (1,1,4,5,1,4) & _1 .~ 5
(5,1,4,5,1,4)

> (1,1,4,5,1,4) & each %~ (*2) -- eachで全要素を参照するぜ! 
(2,2,8,10,2,8)

> [1,1,4,5,1,4] & ix 0 .~ 5
[5,1,4,5,1,4]

Stateモナドでも動くぜ!

> import Control.Monad.State
> flip runStateT (1,1,4,5,1,4) $ use _1
(1,(1,1,4,5,1,4))
> flip runStateT (1,1,4,5,1,4) $ _1 .= 5
((),(5,1,4,5,1,4))
> flip runStateT [1,1,4,5,1,4] $ each %= (*2)
((),[2,2,8,10,2,8])

データ型の各レコードに対応するLensを自動生成する機能もあるぜ!

{-# LANGUAGE TemplateHaskell #-}
import Data.Map (Map)
import Control.Lens

data DB = DB
    { _foo :: Map String Int
    , _bar :: String
    , _baz :: Int
    }
makeLenses ''DB

-- makeLenses ''DB generates:
-- foo :: Lens DB (Map String Int)
-- bar :: Lens DB String
-- baz :: Lens DB Int

XML*1JSON*2もLensで操作できるぜ!

Lensにはたくさんあんまり出番がない兄弟があるのでそこんとこよろしく!

じゃあな!