7

有没有办法让我只从带有镜头的模块中导出特定的 getter 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吸气剂?

4

2 回答 2

10

A lens isn't, in fact, "a getter and a setter", it just happens to be isomorphic to such a pair. So you can't just export one of them, rather you have to define something new and export that. Fortunately, this is extremely simple:

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

count :: Getter Counter Int
count = count'
于 2014-12-14T23:33:05.060 回答
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
于 2015-01-18T03:54:42.970 回答