[英]Fusion law for foldr1?
对于foldr
我们有融合定律 :如果f
是严格的, fa = b
,和
f (gxy) = hx (fy)
表示所有x, y
,然后是f . foldr ga = foldr hb
f . foldr ga = foldr hb
。
如何为foldr1
发现/推导出类似的法则? (它显然甚至不能采用相同的形式 - 考虑双方对[x]
采取行动的情况。)
您可以使用自由定理来推导融合定律等语句。 自由生成自由定理这对你foldr1
如果输入foldr1
或类型(a -> a -> a) -> [a] -> a
,它会自动导出以下语句。
如果f
strict和f (pxy) = q (fx) (fy))
对于所有x
和y
你有f (foldr1 pz) = foldr1 q (map fz))
。 也就是说,与你关于foldr
陈述相反,你会在右侧获得一个额外的map f
。
还要注意, foldr
的自由定理比你的融合定律略foldr1
,因此看起来与foldr1
的定律非常相似。 即,对于所有x
和y
g (foldr pzv) = foldr q (gz) (map fv))
g (pxy) = q (fx) (gy))
对于所有x
和y
你具有严格函数g
和f
,然后g (foldr pzv) = foldr q (gz) (map fv))
。
我不知道是否会有任何令人满意的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.