2014-12-14 14 views
7

렌즈가있는 모듈에서 특정 getter xor setters 만 내보내는 방법이 있습니까? 어떻게 수있을 것모듈에서 getter 또는 setter 만 내보내기

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) 

: 예를 들어

, 현실을 증가하고 0의 초기 값 만 생성되는 만 수정되고, >= 0 항상되는 불변이있는 데이터 구조를 가정하자 게터 count 만 내보내시겠습니까?

답변

10

렌즈는 실제로 "게터와 설정자"가 아니며 그러한 쌍에 동형이됩니다. 그래서 당신은 그 중 하나만 내보낼 수는 없으며, 새로운 것을 정의하고 내보내기를해야합니다. 다행히, 이것은 매우 간단하다 :

만 (적절한) 새 generateUpdateableOptics이 설정을 사용할 수 있습니다 GetterFold 광학을 생성 할 경우
data Counter = Counter { _count' :: Int } deriving (Eq) 
makeLenses ''Counter 

count :: Getter Counter Int 
count = count' 
2

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