【问题标题】:Can one express catamorphism through Data.Function.fix?可以通过 Data.Function.fix 表达变态吗?
【发布时间】:2018-07-20 04:49:02
【问题描述】:

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

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.过去有好几次伙伴。

【问题讨论】:

  • 我不明白。如果您尝试类似的 fixcata f = fix $ \g -> f . fmap g . unFix 会发生什么?
  • @chi 哦。又败了。我对固定点很差。我可能应该删除这个问题以避免尴尬。
  • 当一个人被“击败”时,SO 不是一场游戏 :) 在事先不知道答案的情况下提出问题并没有错——事实上这就是提问的全部意义!

标签: haskell recursion optimization fixpoint-combinators catamorphism


【解决方案1】:

其实这和变质无关。

每当一个函数被定义为

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

【讨论】:

  • 谢谢!你也可以看看更新的帖子吗?
  • @Kindaro 您应该将该更新(我现在回滚)作为一个单独的问题,因为它与原始问题的标题没有直接关系。
  • @Kindaro 另请先查看this。我认为这与提高性能的问题完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2020-06-13
  • 2013-01-30
  • 2019-03-02
  • 2011-12-22
相关资源
最近更新 更多