2014-02-28 3 views
5

나는 documentation on monad layers package을 읽으며 내 뇌는 끓을 것입니다.불변성 Functor의 예?

이 문서의 mmtl 섹션에서 저자는 불변의 functor에 대해 이야기합니다. 방법이 invmap 인 것은 fmapFunctor인데 반비례도를 취합니다 (b -> a). 저자는 MFunctorhoistInvarianttmap보다 더 강력한 것을 말한다 이유는 이해하지만 난 그 역 morphism에 지점 무엇을 볼 수 없습니다.

Functor의 인스턴스가 될 수없는 Invariant의 예는 있습니까?

+3

'Endo a' from'Data.Monoid'? – jozefg

+0

예, '엔도'는 불변해야합니다. – Carl

+2

'Contravariant'를 살펴 보는 것이 유용 할 것이라고 생각합니다. 'ExpF B 형 A' 만'Fix' 멀리 PHOAS –

답변

4

여기 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 인스턴스를 사용하여 이러한 유형의 꼭대기 무료 모나드를 구축 할 수 있음을 발견 끝낸다. 아주 좋아!

+1

당신은 또한'바르 b'을 싶지 않을 것이다. 이 시점에서,'ExpF'는 본질적으로 단지 목표로부터 단지 자유 롭습니다. – jozefg

+1

에서 내가 https://www.fpcomplete.com/user/edwardk/phoas 다음 한 이후 –