[英]Can one express catamorphism through Data.Function.fix?
我这里有一个可爱的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
在我看来,我不能,但过去我曾被SO研究员谦虚几次。
实际上,这与变态无关。
每当函数定义为
f = (... f ...) -- some expression involving f
一个人可以用fix
重写它
f = fix $ \g -> (... g ...)
在发布的代码中,我们有一个稍微的变化
f x = (... (f x) ...)
我们可以将上面的f
视为递归定义。 但是,如果我们以递归方式定义fx
(而不是f
),则更为简单。
f x = fix $ \g -> (... g ...)
这应该比普通翻译更有效
f = fix $ \g x -> (... (g x) ...)
因为我们不需要用相同的参数x
反复调用g
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.