2014-12-14 23 views
7

Esiste un modo per esportare specifici getter xor setter da un modulo con un obiettivo?Esporta solo getter o setter da un modulo

Ad esempio, supponiamo che una struttura di dati che ha un'invariante di essere sempre >= 0, vengano modificati solo incrementando esso ed essere create solo con un valore iniziale di 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) 

come sarei in grado esportare solo il getter count?

risposta

10

Un obiettivo non è, in effetti, "un getter e un setter", ma sembra proprio essere isomorfo a tale coppia. Quindi non puoi esportarne solo uno, piuttosto devi definire qualcosa di nuovo ed esportarlo. Fortunatamente, questo è estremamente semplice:

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

count :: Getter Counter Int 
count = count' 
2

Se si desidera generare solo Getter e Fold ottica (a seconda dei casi) è possibile utilizzare la nuova impostazione 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