여기 Invariant
가 나타 곳 표준 곳 --- 람다 계산법을 삽입하는 고차의 추상 구문 (행 아웃 온에어). 행 아웃 온에어에서 우리는 이런 종류의 Functor
같은 구조를 가지고 있지만 Lam
긍정적이고 부정적인 위치에 a
의이 있기 때문에 슬프게도이 될 수 없다 위해 우리는 싶지만
data ExpF a
= App a a
| Lam (a -> a)
-- ((\x . x) (\x . x)) is sort of like
ex :: ExpF (ExpF a)
ex = App (Lam id) (Lam id)
-- we can use tricky types to make this repeat layering of `ExpF`s easier to work with
같은 표현 유형을 쓰는 것을 좋아합니다. 그래서 그 대신 우리는
instance Invariant ExpF where
invmap ab ba (App x y) = App (ab x) (ab y)
invmap ab ba (Lam aa) = Lam (ab . aa . ba)
을 정의 이것은 우리가 정말하고 싶은 것은이 ExpF
재귀 식 트리를 형성 자체에 입력 접을 수 있기 때문에 정말 비극이다. Functor
이라면 명백 할 것입니다. 그러나 그렇지 않기 때문에 우리는 아주 못 생기고 도전적인 구성을 갖게됩니다.
이 문제를 해결하려면, 당신은 다른 유형의 매개 변수를 추가하고 전화 파라 메트릭 아웃 온에어
data ExpF b a
= App a a
| Lam (b -> a)
deriving Functor
그리고 우리는 우리가 바인딩 곳 변수 대체 자사의 Functor
인스턴스를 사용하여 이러한 유형의 꼭대기 무료 모나드를 구축 할 수 있음을 발견 끝낸다. 아주 좋아!
'Endo a' from'Data.Monoid'? – jozefg
예, '엔도'는 불변해야합니다. – Carl
'Contravariant'를 살펴 보는 것이 유용 할 것이라고 생각합니다. 'ExpF B 형 A' 만'Fix' 멀리 PHOAS –