기능성 렌즈


80

누군가 기능 렌즈를 설명해 주시겠습니까? Google에게는 놀랍도록 어려운 주제이며 진전을 이루지 못했습니다. 내가 아는 것은 OO와 비슷한 get / set 기능을 제공한다는 것입니다.


7
렌즈에 좋은 소개 YouTube에서 에드워드 Kmett으로는. 예제는 Scala에 있지만 따라하기가 너무 어렵지는 않습니다.
hammar

그래, 그걸 보려고했지만 내가 여전히 경계하는 동안 충분한 시간을 갖는 것은 그렇게 쉽지 않다 : P
Masse

2
@Jochen : 거기에 설명 된 렌즈는이 질문에 관한 렌즈와 공통점이 많지 않습니다.
sclv

3
다음은 사진을 사용한 멋진 소개 입니다. 사진 속의 렌즈 .
Debjit

답변:


61

렌즈는 게터와 세터의 두 가지 기능으로 구성됩니다.

data Lens a b = Lens { getter :: a -> b, setter :: b -> a -> a }

예를 들어 한 쌍의 첫 번째 부분과 두 번째 부분에 대한 렌즈가있을 수 있습니다.

fstLens :: Lens (a, b) a
fstLens = Lens fst $ \x (a, b) -> (x, b)

sndLens :: Lens (a, b) b
sndLens = Lens snd $ \x (a, b) -> (a, x)

렌즈의 진정한 편리함은 다음을 구성한다는 것입니다.

compose :: Lens b c -> Lens a b -> Lens a c
compose f g = Lens (getter f . getter g) $
                   \c a -> setter g (setter f c (getter g a)) a

그리고 그들은 기계적으로 전환으로 State변환합니다.

lensGet :: MonadState s m => Lens s a -> m a
lensGet = gets . getter

lensSet :: MonadState s m => Lens s b -> b -> m ()
lensSet f = modify . setter f

lensMod :: MonadState s m => Lens s b -> (b -> b) -> m ()
lensMod f g = modify $ setter f =<< g . getter f

(+=) :: (MonadState s m, Num b) => Lens s b -> b -> m ()
f += x = lensMod f (+ x)

작성 예제가 유형 검사를하지 않았습니다. GHC 추론; 렌즈 aa-> 렌즈 aa-> 렌즈 aa
Masse 2011

Masse : 실수로 fg.
Apocalisp 2011

여전히 a-> c에 check를 입력하지 않습니다. 작성으로 추론 :: Lens ab-> Lens aa-> Lens ab
Masse

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.