2014-12-14 5 views
7

Есть ли способ для меня только экспортировать определенные геттеры xor сеттеры из модуля с объективом?Экспортировать только геттер или сеттер из модуля

Например, давайте предположим, что структура данных, которая имеет инвариант всегда быть >= 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 геттер?

ответ

10

Линза не является, по сути, «геттером и сеттером», это просто изоморфно такой паре. Таким образом, вы не можете просто экспортировать один из них, скорее вам нужно определить что-то новое и экспортировать. К счастью, это очень просто:

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

count :: Getter Counter Int 
count = count' 
2

Если вы хотите только генерировать Getter и Fold оптики (в зависимости от обстоятельств), вы можете использовать новый 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