haskell - 可以通过Data.Function.fix来表达变形吗?

标签 haskell recursion optimization fixpoint-combinators catamorphism

我这里有一个可爱的 fixana 函数,它的执行速度比她的姐妹 ana 快大约 5 倍。 (我有一个标准报告来支持我这一点)

ana alg = Fix . fmap (ana alg) . alg

fixana alg = fix $ \f -> Fix . fmap f . alg

我可以用同样的方式表达他们的表弟cata吗?

cata f = f . fmap (cata f) . unFix

在我看来,我不能,但我对我的 S.O. 感到谦卑。过去好几次了。

最佳答案

实际上,这与变形现象无关。

每当函数定义为

f = (... f ...)   -- some expression involving f

可以使用fix将其重写为

f = fix $ \g -> (... g ...)

在发布的代码中我们有一个轻微的变体

f x = (... (f x) ...)

我们可以将上面视为递归定义的f。然而,如果我们认为 f x (而不是 f)是递归定义的,那就更简单了。

f x = fix $ \g -> (... g ...)

这应该比简单的翻译更有效率

f = fix $ \g x -> (... (g x) ...)

因为我们不需要使用相同的参数 x 一遍又一遍地调用 g

关于haskell - 可以通过Data.Function.fix来表达变形吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48705438/

相关文章:

haskell - 创建 Int 和函数列表 Int -> Int -> Int

ruby - Ruby 中的递归文件列表

javascript - 递归而不是for循环

python - 如何解决在 Flask Web 服务器中使用 Pyomo 时出现错误?

Yesod/Persistent 的 MongoDB 示例

haskell - 具有递归和列表理解的质数生成器

haskell - 使用镜头两次

haskell - 获取列表中元素的偶数和奇数位置 - Haskell 相互递归

javascript - 比较对象数组,最佳方式

javascript - jQuery 当使用 iframe 时,我应该尝试合并 jQuery 的内部和外部实例吗?