Экспорт только модуля или метода установки из модуля
Есть ли способ для меня экспортировать только определенные геттеры или сеттеры из модуля с объективом?
Например, давайте предположим, что структура данных имеет инвариант всегда >= 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 ответа
Решение
На самом деле линза не является "геттером и сеттером", она просто изоморфна такой паре. Таким образом, вы не можете просто экспортировать один из них, вы должны определить что-то новое и экспортировать это. К счастью, это очень просто:
data Counter = Counter { _count' :: Int } deriving (Eq)
makeLenses ''Counter
count :: Getter Counter Int
count = count'
Если вы хотите только генерировать 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