나는 (그것이 무엇을, 참으로, 또는!) 하스켈 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
일 수 있습니다. 올바른 유형이 아닙니다.
GHC에 유형을 묻는 표현식 대신'_'을 사용할 수 있습니다. – arrowd
그리고 wrt. 이스케이프 (escaping) :'t'는'Recursive' 클래스입니다. 즉'* -> * '종류입니다. 이것은 gpospro 리턴 타입이 아무 것도 벗어나지 않고 뭔가에 싸여 있음을 암시합니다. 아마도 모나드 일 겁니다. – arrowd
@arrowd 위의 타입 시그니처는'* -> * '타입의 리턴 타입을 가질 수 없기 때문에 불가능합니다. –