时间性的一个例子

时间:2017-10-02 12:35:30

标签: haskell recursion-schemes

我不明白如何用chronomorphism创建一些例子。 我知道有关hylomorphism(cataana)我也知道histofutu

但我没有意识到一些关于chronomorphism的例子(也许是Tardis monad中的一些行为)。

还有相关链接https://github.com/ekmett/recursion-schemes/issues/42

这与Histomorphisms, Zygomorphisms and Futumorphisms specialised to lists无关,因为没有一些关于时间性的例子。

1 个答案:

答案 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来将其拆除(虽然这是封闭的)。当然,这张地图实际上是时间变形的另一种特殊化。