Пример хрономорфизма

Я не понимаю, как я могу создать пример с хрономорфизмом. Я знаю о гиломорфизме (cata, ana), также я знаю о histo и futu.

Но я не понимаю какого-то примера хрономорфизма (может быть, какое-то поведение, как в монаде Тардис).

Также связанная ссылка https://github.com/ekmett/recursion-schemes/issues/42

Это не связано с гистоморфизмами, зигоморфизмами и футуморфизмами, специализированными для списков потому что не имеет примера с хрономорфизмом.


person xgrommx    schedule 02.10.2017    source источник
comment
возможно, задав вопрос по адресу [email protected], это может помочь   -  person palik    schedule 02.10.2017
comment
см. также stackoverflow.com/a/37002861/2789312   -  person palik    schedule 02.10.2017
comment
gist.github.com/danidiaz/e5debcaf531838eb6e2afd3ef3b34d60   -  person danidiaz    schedule 02.10.2017
comment
Это не дубликат. потому что нет примера с хроно в stackoverflow .com/questions/36851766/   -  person xgrommx    schedule 03.10.2017
comment
Я снова открываю этот вопрос. Можно обсудить достоинства вопроса сам по себе, но, хотя он похож на связанный вопрос, он определенно не дублируется.   -  person Benjamin Hodgson♦    schedule 03.10.2017


Ответы (1)


Вероятно, наиболее частое использование хрономорфизмов — это свертывание именованного синтаксического дерева. В частности, вы можете ссылаться на имена, которые еще не были обработаны, а также на имена, которые были уже обработаны.

Еще одна вещь, которую вы можете сделать с хрономорфизмами, — это переписать динамоморфизмы! Подробнее о динамоморфизмах можно прочитать здесь. Один из примеров, который они приводят, — каталонские номера. Я перевел его на Haskell ниже.

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

Вы также можете найти это полезный. В нем есть пример, в котором используется футуморфизм для построения дерева и катаморфизм для его разрушения (хотя это закрыто). Конечно, эта карта на самом деле является еще одной специализацией хрономорфизма.

person Community    schedule 11.10.2017
comment
Извините, но похоже ваш код не работает. Не могли бы вы предоставить рабочую версию? - person xgrommx; 19.10.2017
comment
Я не понимаю, почему гистоморфизм для каталонских чисел, приведенный в этой статье, называется фиктивным решением, хотя он дает правильные результаты в Haskell? Почему преобразование коиндуктивного аргумента в функцию elems в простой индуктивный список является подделкой? Является ли это подделкой только в языках с более сильными системами типов, такими как Agda? - person rubystallion; 06.03.2021