对于foldr
,我们有融合法:如果f
是严格的,f a = b
和
f (g x y) = h x (f y)
x, y
,然后是f . foldr g a = foldr h b
。
如何为foldr1
发现/推导出类似的法律? (它显然甚至不能采用相同的形式 - 考虑双方对[x]
采取行动的情况。)
答案 0 :(得分:10)
您可以使用自由定理来推导融合定律等语句。 Automatic generation of free theorems这对您有用,如果您输入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
的定律非常相似。也就是说,对于所有g
和f
以及g (p x y) = q (f x) (g y))
,如果x
有严格的功能y
和g (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