2017-10-02 6 views
1

나는 chronomorphism으로 몇 가지 예를 어떻게 만들 수 있는지 이해할 수 없다. hylomorphism (cata, ana)에 대해서도 알고 있습니다. 또한 histofutu에 대해 알고 있습니다.chronomorphism의 예

하지만 나는 연대기 (Tardis 모나드에서와 같은 동작)에 대한 몇 가지 예를 알지 못합니다.

는 또한 링크 https://github.com/ekmett/recursion-schemes/issues/42

chronomorphism 몇 가지 예를 가지고 있지 않기 때문에이 Histomorphisms, Zygomorphisms and Futumorphisms specialised to lists와 관련이없는 관계.

+0

아마도 [email protected]의 질문을 퍼팅 – palik

+0

도 https://stackoverflow.com/a/37002861/2789312 – palik

+1

https://gist.github.com/danidiaz/e5debcaf531838eb6e2afd3ef3b34d60 – danidiaz

답변

0

아마 가장 큰 chronomorphism의 사용은 명명 된 구문 트리를 축소하는 것입니다. 특히 아직 처리되지 않은 이름과 이 이미 처리 된 이름을 참조 할 수 있습니다.

당신이 chronomorphisms로 할 수있는 또 다른 일은 동역학을 다시 쓰는 것입니다! 동 각 변성에 관한 자세한 내용은 here을 참조하십시오. 그들이 인용 한 사례 중 하나는 카탈로니아 어 숫자입니다. 나는 하스켈에게 그것을 아래 번역했다.

import Data.Functor.Foldable 
import Control.Arrow 
import Control.Comonad.Cofree 

dyna :: (Functor f) => (f (Cofree f a) -> a) -> (c -> f c) -> c -> a 
dyna a c = extract . h where h = (uncurry (:<)) . (a &&& id) . fmap h . c 

catalan :: Int -> Int 
catalan = dyna coalgebra project where 
    coalgebra :: ListF Int (Cofree ListF Int) -> Int 
    coalgebra Nil = 1 
    coalgebra (Cons x table) = sum $ zipWith (*) xs (reverse xs) 
     where xs = take x table 

this도 유용 할 수 있습니다. 그것은 futumorphism을 사용하여 나무를 만들고 그것을 찢어 버리는 변성 작용을 사용한 예가 있습니다 (이것이 폐색되었지만). 물론,이지도는 사실 연대순 변이의 또 다른 전문화입니다.

+0

죄송합니다. 코드가 작동하지 않는 것 같습니다. 작동 버전을 제공해 주시겠습니까? – xgrommx