是否可以通过 Data.Function.fix 来表达变形?
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
在我看来我不能,但我对我的 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) ...)
因为我们不需要用相同的参数一遍又一遍地调用 g
x
。
我这里有一个可爱的 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 感到谦卑。老乡们过去好几次了
实际上,这与变形无关。
每当函数定义为
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) ...)
因为我们不需要用相同的参数一遍又一遍地调用 g
x
。