foldr1的融合法?

Fix*_*num 8 haskell functional-programming

因为foldr我们有融合法:如果f是严格的f a = b,和

f (g x y) = h x (f y)对所有人来说x, y,那么f . foldr g a = foldr h b.

如何发现/得出类似的法律foldr1?(它显然甚至不能采取相同的形式 - 考虑双方采取行动的情况[x].)

Jan*_*sen 10

您可以使用自由定理来推导融合定律等语句.该自动生成的自由定理做这个工作对你来说,它会自动导出,如果你输入下面的语句foldr1或类型(a -> a -> a) -> [a] -> a.

如果f严格而且f (p x y) = q (f x) (f y))对所有人x而且y你有f (foldr1 p z) = foldr1 q (map f z)).也就是说,与你的声明形成鲜明对比的是你在右侧foldr获得了额外的补充map f.

还要注意,自由定理foldr比你的融合定律略微更普遍,因此看起来非常类似于法则foldr1.即你有严格的功能gf是否g (p x y) = q (f x) (g y))所有xyg (foldr p z v) = foldr q (g z) (map f v)).

  • 自由定理考虑多态函数使用`undefined`的情况.在'foldr1`的情况下,它的要求是`f`必须严格.实际上,Philip Wadler已经在他关于自由定理的原始论文中观察到了这一要求.在自动生成网站中,通过使用"一般递归但没有选择性严格性"选项,您可以获得"未定义"的这些附加条件.您还可以使用选项"general recursion and selective strictness"来考虑严格评估原语`seq`的存在. (2认同)