我不明白如何用chronomorphism创建一些例子。
我知道有关hylomorphism(cata
,ana
)我也知道histo
和futu
。
但我没有意识到一些关于chronomorphism的例子(也许是Tardis monad中的一些行为)。
还有相关链接https://github.com/ekmett/recursion-schemes/issues/42
这与Histomorphisms, Zygomorphisms and Futumorphisms specialised to lists无关,因为没有一些关于时间性的例子。
答案 0 :(得分:0)
chronomorphisms的最大用途可能是折叠一个命名的语法树。特别是,您可以引用尚未处理的名称以及已已经处理过的名称。
你可以用chronomorphisms做的另一件事是重写动力学!您可以阅读有关dynamorphisms here的更多信息。他们引用的一个例子是加泰罗尼亚语数字。我已将它翻译成下面的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
您可能还会发现this有用。它有一个例子,它使用一个未来主义来构建一个树和一个catamorphism来将其拆除(虽然这是封闭的)。当然,这张地图实际上是时间变形的另一种特殊化。