foldr1的融合法?

时间:2011-07-25 02:36:32

标签: 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]采取行动的情况。)

2 个答案:

答案 0 :(得分:10)

您可以使用自由定理来推导融合定律等语句。 Automatic generation of free theorems这对您有用,如果您输入foldr1或类型(a -> a -> a) -> [a] -> a,它会自动导出以下语句。

如果f严格且f (p x y) = q (f x) (f y))适用于所有xy,则f (foldr1 p z) = foldr1 q (map f z))。也就是说,与您对foldr的陈述相反,您在右侧会额外获得map f

还要注意foldr的自由定理比你的融合定律略宽一些,因此看起来与foldr1的定律非常相似。也就是说,对于所有gf以及g (p x y) = q (f x) (g y)),如果x有严格的功能yg (foldr p z v) = foldr q (g z) (map f v))

答案 1 :(得分:2)

我不知道foldr1是否会有任何令人满意的事情。 [我认为]它只是定义为

foldr1 f (x:xs) = foldr f x xs

让我们首先展开上面的内容,以便在整个列表中工作,

f (foldr g x xs) = foldr h (f x) xs

对于foldr1,你可以说,

f (foldr1 g xs) = f (foldr g x xs)
= foldr h (f x) xs

重新进入foldr1,你可以创建一些虚构函数,将f映射到左边的元素,结果为,

f . foldr1 g = foldr1 h (mapfst f) where
    mapfst (x:xs) = f x : xs