镜头类型的镜头和棱镜

时间:2015-01-15 13:32:44

标签: lens

此代码无法编译。

{-# 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’。我有两个问题。

  1. 有没有办法做这样的事情,还是我需要为B编写自己的镜头?
  2. 给定A,如果该字段存在,我想将函数应用于b1字段。我认为这是棱镜的工作,但我还没弄明白该怎么做。

1 个答案:

答案 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 ''BTraversal字段创建_b1,因为它只出现在两个构造函数之一中。

b1 :: Traversal' B Int

如果您还要使用Prisms,则需要添加

makePrisms ''B

会产生

_B1 :: Prism' B Int
_B2 :: Prism' B ()