0

我不明白如何用时态创建一些例子。我知道 hylomorphism ( cata, ana) 也知道histoand futu

但是我没有意识到时态的一些例子(可能是 Tardis monad 中的一些行为)。

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

这与专门用于列表的 Histomorphisms、Zygomorphisms 和 Futumorphisms 无关,因为没有一些关于时态的例子。

4

1 回答 1

0

可能时态的最大用途是折叠命名语法树。特别是,您可以引用尚未处理的名称以及已处理的名称。

用时态可以做的另一件事是重写变态!你可以在这里阅读更多关于变态的信息。他们引用的例子之一是加泰罗尼亚数字。我已将其翻译为下面的 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

您可能还会发现很有用。它有一个使用 futumorphism 构建树和 catamorphism 将其拆除的示例(尽管这已被遮挡)。当然,这张地图实际上是时态的另一种特殊化。

于 2017-10-11T21:50:47.847 回答