考虑表达式E1 = foldl op acc l
和E2 = foldr op acc l
。
op
,acc
和/或l
有哪些自然充分条件可以保证E1
和E2
的等效性?
一个简单的例子是,如果op
是常数,那么两者都是等价的。
我很确定必须存在涉及op
和/或l
的有限性和/或acc
的中立性的交换性和/或相关性的精确条件。
答案 0 :(得分:5)
如果op
是关联操作,acc
是op
的中性元素,而l
是有限的,则它们是等效的。
确实,foldr
的结果是
(l1 `op` (l2 `op` ... (ln `op` acc)))
而foldl
的
(((acc `op` l1) `op` l2) `op` ... ln)
为了证明它们是平等的,只需简化acc
并重新关联即可。
即使acc
不是中性元素,但acc
仍然满足较弱的条件
forall x, acc `op` x = x `op` acc
然后,如果op
是关联的且l
是有限的,我们再次得到所需的等价。
为了证明这一点,我们可以利用这样一个事实:acc
与所有事物进行通信,并将其从尾部位置“移动”到头部位置,利用相关性。 E.g。
(l1 `op` (l2 `op` acc))
=
(l1 `op` (acc `op` l2))
=
((l1 `op` acc) `op` l2)
=
((acc `op` l1) `op` l2)
在问题中提到了足够的条件op = const k
,它是关联的,但没有中性元素。尽管如此,任何acc
都会与所有内容进行通信,因此“常量op
”情况是上述充分条件的一个子句。
假设op
有一个中性元素acc
,如果我们假设
foldr op acc [a,b,c] = foldl op acc [a,b,c] -- (*)
我们派生
a `op` (b `op` c) = (a `op` b) `op` c
因此,如果(*)
适用于所有a,b,c
,那么op
必须是关联的。那么相关性是必要且充分的(当存在中性元素时)。
如果l
是无限的,foldl
无论op,acc
是什么,总是会发散。如果op
对其第二个参数严格,foldr
也会发散(即返回底部)。