此代码无法编译。
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data A = A { _a1 :: B, _a2 :: Int }
makeLenses ''A
data B = B1 { _b1 :: Int } | B2
makeLenses ''B
错误为amy.hs:5:21: Not in scope: type constructor or class ‘B’
。我有两个问题。
B
编写自己的镜头?A
,如果该字段存在,我想将函数应用于b1
字段。我认为这是棱镜的工作,但我还没弄明白该怎么做。答案 0 :(得分:1)
按如下方式重新排列您的程序
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data A = A { _a1 :: B, _a2 :: Int }
data B = B1 { _b1 :: Int } | B2
makeLenses ''A
makeLenses ''B
问题与模板Haskell的暂存顺序有关(在这种情况下,它可能是一个错误)。
观察makeLenses ''B
为Traversal
字段创建_b1
,因为它只出现在两个构造函数之一中。
b1 :: Traversal' B Int
如果您还要使用Prisms,则需要添加
makePrisms ''B
会产生
_B1 :: Prism' B Int
_B2 :: Prism' B ()