如何从GHCi中的记录制作镜头

Joh*_*ler 16 haskell ghci template-haskell haskell-lens

我想和Lens图书馆玩一下.我已将其加载到GHCi中并使用适当的下划线创建记录数据类型:

> data Foo a = Foo {_arg1 :: Int, _arg2 :: [a]}
Run Code Online (Sandbox Code Playgroud)

我想制作Foo使用makeLenses模板的镜头.我想这样做而不需要阅读整套Template-Haskell文档.

我可以在GHCi提示符下输入什么咒语来使其工作?

kga*_*dek 15

在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
:}
Run Code Online (Sandbox Code Playgroud)

(我认为该:{ ... :}块是makeLenses工作所必需的).

我们来简要检查一下:

? >> AChar 100 'f' ^. aid
100
? >> AChar 100 'f' ^? cval
Just 'f'
? >> AInt 101 0 ^? cval
Nothing
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是,`makeLenses`调用必须在*same*`:{`块中作为数据声明!这让我陷入了一个循环,直到我弄清楚了. (2认同)
  • 在{block和`makeLenses`一起使用_any_语句就足够了(它不必是AST声明).据我所知,ghci会将`makeLenses`扩展为声明列表.如果:{block中只有一个语句,则它会尝试将其展开为表达式,从而导致类型不匹配错误. (2认同)