18

I want to play around with the Lens library a bit. I've loaded it into GHCi and created a record data type with the appropriate underscores:

> data Foo a = Foo {_arg1 :: Int, _arg2 :: [a]}

I would like to make the lenses for Foo using the makeLenses template. I would like to do this without needing to read through the entire set of Template-Haskell docs.

What incantation can I type in at the GHCi prompt to get this to work?

John F. Miller
  • 26,961
  • 10
  • 71
  • 121

1 Answers1

19

Tested in GHCi 7.8.3:

:set -XTemplateHaskell
:m +Control.Lens
:{
data AST = AInt  { _aid :: Int, _ival :: Int }
         | AChar { _aid :: Int, _cval :: Char }
         deriving (Show)
makeLenses ''AST
:}

(I believe that the :{ ... :} block is necessary for makeLenses to work).

Let's briefly check:

λ >> AChar 100 'f' ^. aid
100
λ >> AChar 100 'f' ^? cval
Just 'f'
λ >> AInt 101 0 ^? cval
Nothing
kgadek
  • 1,446
  • 1
  • 17
  • 18
  • 4
    It is worth mentioning that the `makeLenses` call has to go in the *same* `:{` block as the data declaration! That threw me for a loop until I figured it out. – kqr Mar 31 '15 at 11:45
  • 2
    It's enough to have _any_ statement in the :{ block together with `makeLenses`, (it does not have to be the AST declaration). As far as I understand, then ghci will expand the `makeLenses` as declaration list. If there is only one statement in :{ block, then it tries to expand it as expression, giving type mismatch error. – max630 Apr 12 '16 at 15:07