2014-12-14 5 views
7

Gibt es eine Möglichkeit für mich, nur spezifische Getter xor Setter von einem Modul mit einem Objektiv zu exportieren?Nur Getter oder Setter aus einem Modul exportieren

Zum Beispiel wollen wir eine Datenstruktur annehmen, die eine unveränderliche des Seins immer >= 0 hat, nur dann geändert werden, indem sie erhöht wird und nur mit einem Anfangswert von 0 erstellt werden:

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) 

wie würde ich in der Lage nur den count Getter exportieren?

Antwort

10

Eine Linse ist in der Tat nicht "ein Getter und ein Setter", es ist einfach so isomorph zu solch einem Paar. Man kann also nicht einfach einen davon exportieren, sondern muss etwas Neues definieren und exportieren. Glücklicherweise ist dies sehr einfach:

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

count :: Getter Counter Int 
count = count' 
2

Wenn Sie nur wollen Getter und Fold Optik erzeugen (je nach Bedarf) können Sie die neue generateUpdateableOptics verwenden Einstellung

{-# 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