从模块中仅导出getter或setter

7
有没有一种方法可以让我从一个使用 lens 的模块中只导出特定的 getter 或 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 getter?

2个回答

10

事实上,一个镜头并不是"getter和setter",它只是与这样的一对同构。因此,您不能仅导出其中一个,而是必须定义一个新的内容并将其导出。幸运的是,这非常简单:

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

count :: Getter Counter Int
count = count'

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接