Экспорт только модуля или метода установки из модуля

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

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