foldl和foldr等价的充分条件

时间:2017-11-26 11:51:30

标签: haskell fold

考虑表达式E1 = foldl op acc lE2 = foldr op acc l

opacc和/或l有哪些自然充分条件可以保证E1E2的等效性?

一个简单的例子是,如果op是常数,那么两者都是等价的。

我很确定必须存在涉及op和/或l的有限性和/或acc的中立性的交换性和/或相关性的精确条件。

1 个答案:

答案 0 :(得分:5)

如果op是关联操作,accop的中性元素,而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也会发散(即返回底部)。