2016-09-25 8 views
2

나는 (그것이 무엇을, 참으로, 또는!) 하스켈 recursion-schemes 패키지에서이 매우 추상적 재귀 함수의 작동 방식을 이해하려고 노력하고 있어요 - this file에서 : 특히gpostpro는 "모나드에서 벗어나"어떻게합니까?

class Functor (Base t) => Corecursive t where 

    [...] 

    -- | A generalized postpromorphism 
    gpostpro 
    :: (Recursive t, Monad m) 
    => (forall b. m (Base t b) -> Base t (m b)) -- distributive law 
    -> (forall c. Base t c -> Base t c)   -- natural transformation 
    -> (a -> Base t (m a))      -- a (Base t)-m-coalgebra 
    -> a          -- seed 
    -> t 
    gpostpro k e g = a . return where a = embed . fmap (ana (e . project) . a . join) . k . liftM g 

, 제가 이해하고 싶은 것은 : 모나드 유형 생성자 m을 언급하고 t 유형의 값을 반환하는 g 함수를 어떻게 적용합니까? m을 언급하거나 의존하지 않습니다. 나는 하스켈에서 임의의 모나드로부터 탈출하는 것이 불가능하다고 생각했다!

먼저 입력 파일을 Intero에로드하여 유형 대 지점 기능을 사용하려했지만 시도는 failed입니다.

그런 다음 cabal repl을 사용하여 GHCi에로드하고 정의의 다양한 비트를 주석 처리하여 유형 유추를 돕기 위해 GHCi를 사용하여 한 번에 하나씩 구성된 함수를 통해 유형을 따라 가려고했습니다. 그러나 fmap에 도착했을 때 재귀적인 a 호출을 주석 처리했지만 다른 내용을 주석 처리했기 때문에 부분적으로 주석 처리 되었기 때문에 컴파일되지 않았을 것이라고 생각했기 때문에 주석 처리 할 부분을 찾지 못했습니다. 정의a 일 수 있습니다. 올바른 유형이 아닙니다.

+1

GHC에 유형을 묻는 표현식 대신'_'을 사용할 수 있습니다. – arrowd

+0

그리고 wrt. 이스케이프 (escaping) :'t'는'Recursive' 클래스입니다. 즉'* -> * '종류입니다. 이것은 gpospro 리턴 타입이 아무 것도 벗어나지 않고 뭔가에 싸여 있음을 암시합니다. 아마도 모나드 일 겁니다. – arrowd

+1

@arrowd 위의 타입 시그니처는'* -> * '타입의 리턴 타입을 가질 수 없기 때문에 불가능합니다. –

답변

2

하위 식의 유형이 주위를 둘러싼 것이 무엇인지 알기 위해 ghci를 얻을 수있었습니다. ( ... :: _).

은 "분배 법"k는 임시 Base 유형 내부 모나드를 밀어 수, 트릭은 밝혀, 다음 embed 방법은 임시 Base 유형에 닿아 t 다시 얻을 수 있습니다. 실제로 콘크리트 유형 tIO을 언급하지 않으면 IO 모나드에 대해 (안전하게) k을 쓸 수 없습니다. 따라서 마술은 없습니다. 즉, IO와 같이 피할 수없는 모나드를 피하기 위해이 기능을 사용할 방법이 없습니다.

+0

대답으로 답을 표시하십시오. – arrowd