我这里有一个可爱的 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/