Haskell Language
교수
수색…
소개
Profunctor
는 Profunctor
의 profunctors
패키지에서 제공하는 Data.Profunctor
입니다.
자세한 설명은 "주의"절을 참조하십시오.
통사론
- dimap :: Profunctor p => (a -> b) -> (c -> d) -> pbc -> pad
- lmap :: Profunctor p => (a -> b) -> pbc -> pac
- rmap :: Profunctor p => (b -> c) -> pab -> pac
- dimap id id = id
- lmap id = id
- rmap id = id
- dimap fg = lmap f. 지도 g
- lmap f = dimap f id
- rmap f = dimap id f
비고
Profunctor는 Hackage의 문서에서 설명한 것처럼 "첫 번째 인수가 반 변형이고 두 번째 인수가 공변인 인 bifunctor입니다."
그렇다면이게 무슨 뜻입니까? 글쎄, bifunctor는 하나의 매개 변수 대신에 두 개의 매개 변수를 가지고 있다는 점을 제외하고는 일반적인 functor와 같습니다. 각각은 자체 fmap
과 같은 함수로 매핑됩니다.
"공변 (covariant)"한다는 것은 profunctor에 대한 두 번째 인수가 일반 펑터와 같음을 의미합니다. 매핑 함수 ( rmap
)는 Profunctor p => (b -> c) -> pab -> pac
의 형식 시그니처 Profunctor p => (b -> c) -> pab -> pac
. 두 번째 인수에 함수를 매핑하기 만하면됩니다.
"반동 적"이라는 것은 첫 번째 논쟁을 좀 더 이상하게 만든다. 일반적인 펑터처럼 매핑하는 대신 매핑 함수 ( lmap
)는 Profunctor p => (a -> b) -> pbc -> pac
형식 시그니처 Profunctor p => (a -> b) -> pbc -> pac
. 이 겉으로보기에 역방향 매핑은 함수에 대한 입력에 대해 가장 이해가됩니다. 입력에 대해 a -> b
를 실행 a -> b
다음 다른 함수를 실행하고 새 입력을 a
로 남겨 둡니다.
참고 : 일반적인 하나의 인수 펑터에 대한 명명법은 약간 잘못된 것입니다. Functor
typeclass 는 "공변"펑터를 구현하지만 반역 펑터는 Data.Functor.Contravariant
의 Contravariant
Data.Functor.Contravariant
에서 구현되며 이전에는 (오도 된 이름의) Cofunctor
는 Data.Cofunctor
입니다.
(->) 교수
(->)는 profunctor의 간단한 예입니다. 왼쪽 인수는 함수에 대한 입력이고, 오른쪽 인수는 독자 펑터 인스턴스와 같습니다.
instance Profunctor (->) where
lmap f g = g . f
rmap f g = g . g