반응형
기능성 렌즈
누군가 기능 렌즈를 설명해 주시겠습니까? Google에게는 놀랍도록 어려운 주제이며 진전을 이루지 못했습니다. 내가 아는 것은 OO와 비슷한 get / set 기능을 제공한다는 것입니다.
렌즈는 게터와 세터의 두 가지 기능으로 구성됩니다.
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)
질문 렌즈, fclabels, 데이터 접근 자 (구조 접근 및 변형을위한 라이브러리가 더 나은) 에 대한 답변을 참조하십시오. 렌즈에 대한 매우 명확한 설명이 있습니다.
또한 Data.Lenses 및 fclabel 라이브러리에 대한 문서 는 사용되는 좋은 예를 제공합니다.
참고 URL : https://stackoverflow.com/questions/8307370/functional-lenses
반응형
'developer tip' 카테고리의 다른 글
XAML의 읽기 전용 속성에서 OneWayToSource 바인딩 (0) | 2020.10.15 |
---|---|
초 고성능 C / C ++ 해시 맵 (테이블, 사전) (0) | 2020.10.15 |
Visual Studio의 보안 개발 수명주기 검사 옵션은 무엇인가요? (0) | 2020.10.15 |
"rep; (0) | 2020.10.15 |
RESTful API 런타임 검색 기능 / HATEOAS 클라이언트 디자인 (0) | 2020.10.15 |