Вероятно, наиболее частое использование хрономорфизмов — это свертывание именованного синтаксического дерева. В частности, вы можете ссылаться на имена, которые еще не были обработаны, а также на имена, которые были уже обработаны.
Еще одна вещь, которую вы можете сделать с хрономорфизмами, — это переписать динамоморфизмы! Подробнее о динамоморфизмах можно прочитать здесь. Один из примеров, который они приводят, — каталонские номера. Я перевел его на 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