Как сделать линзы из пластинки в GHCi

Я хочу немного поиграть с библиотекой Lens. Я загрузил его в GHCi и создал тип данных записи с соответствующими символами подчеркивания:

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

Я хотел бы сделать линзы для Foo по шаблону makeLenses. Я хотел бы сделать это, не читая весь набор документов по Template-Haskell.

Какое заклинание я могу ввести в приглашении GHCi, чтобы заставить это работать?


person John F. Miller    schedule 23.08.2013    source источник


Ответы (1)


Протестировано в 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
:}

(Я считаю, что блок :{ ... :} необходим для работы makeLenses).

Кратко проверим:

λ >> AChar 100 'f' ^. aid
100
λ >> AChar 100 'f' ^? cval
Just 'f'
λ >> AInt 101 0 ^? cval
Nothing
person kgadek    schedule 19.08.2014
comment
Стоит отметить, что вызов makeLenses должен находиться в том же блоке :{, что и объявление данных! Это бросило меня в тупик, пока я не понял это. - person kqr; 31.03.2015
comment
Достаточно иметь любой оператор в блоке :{ вместе с makeLenses (это не обязательно должна быть декларация AST). Насколько я понимаю, тогда ghci расширит список объявлений makeLenses as. Если в блоке :{ есть только один оператор, то он пытается раскрыть его как выражение, выдавая ошибку несоответствия типов. - person max630; 12.04.2016