我不明白如何用时态创建一些例子。我知道 hylomorphism ( cata
, ana
) 也知道histo
and futu
。
但是我没有意识到时态的一些例子(可能是 Tardis monad 中的一些行为)。
还有相关链接https://github.com/ekmett/recursion-schemes/issues/42
这与专门用于列表的 Histomorphisms、Zygomorphisms 和 Futumorphisms 无关,因为没有一些关于时态的例子。
我不明白如何用时态创建一些例子。我知道 hylomorphism ( cata
, ana
) 也知道histo
and futu
。
但是我没有意识到时态的一些例子(可能是 Tardis monad 中的一些行为)。
还有相关链接https://github.com/ekmett/recursion-schemes/issues/42
这与专门用于列表的 Histomorphisms、Zygomorphisms 和 Futumorphisms 无关,因为没有一些关于时态的例子。
可能时态的最大用途是折叠命名语法树。特别是,您可以引用尚未处理的名称以及已处理的名称。
用时态可以做的另一件事是重写变态!你可以在这里阅读更多关于变态的信息。他们引用的例子之一是加泰罗尼亚数字。我已将其翻译为下面的 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 将其拆除的示例(尽管这已被遮挡)。当然,这张地图实际上是时态的另一种特殊化。