仅从模块导出getter或setter

时间:2014-12-14 23:09:54

标签: haskell invariants lens lenses

我有没有办法只从具有镜头的模块中导出特定的吸气剂xor setter?

例如,让我们假设一个数据结构具有始终为>= 0的不变量,仅通过递增并仅使用初始值0创建来修改:

module Something
    ( Counter
    -- export only `count` getter
    , make
    , increment
    ) where

data Counter = Counter { _count :: Int } deriving (Eq)
makeLenses ''Positive

make :: Counter
make = Counter 0

increment :: Counter -> Counter
increment c = c ^. count %~ (+1)

我怎样才能导出count吸气剂?

2 个答案:

答案 0 :(得分:10)

实际上,镜头并不是“吸气剂和固定器”,它恰好与这样的一对同构。因此,您不能只导出其中一个,而是必须定义新内容并将其导出。幸运的是,这非常简单:

data Counter = Counter { _count' :: Int } deriving (Eq)
makeLenses ''Counter

count :: Getter Counter Int
count = count'

答案 1 :(得分:2)

如果您只想生成GetterFold光学器件(视情况而定),可以使用新的generateUpdateableOptics设置

{-# LANGUAGE TemplateHaskell #-}
import Control.Lens

data Counter = Counter { _count :: Int } deriving (Eq)

let rules = set generateUpdateableOptics False lensRules in
  makeLensesWith rules ''Counter

-- Generates:
-- count :: Getter Counter Int