请用最简单,最无术语的英语解释“折叠的普遍属性”?

时间:2009-05-08 20:41:56

标签: functional-programming fold haskell

我正在通过“真实世界Haskell”工作,这导致了一个名为"A tutorial on the universality and expressiveness of fold"的免费PDF。它指出“折叠”是“普遍的”。我正在努力解决他对“普遍性”的定义,并希望听到那些已经投入时间消化它的人:请用最简单,最无术语的英语解释,“折叠的普遍属性” 这是什么“普遍财产”,为什么重要?

感谢。

5 个答案:

答案 0 :(得分:16)

(术语模式关闭: - )

通用属性只是证明两个表达式相等的一种方式。 (这就是行话“证明原则”的意思。) 普遍属性说如果你能够证明这两个方程式

g []     = v
g (x:xs) = f x (g xs)

然后你可以得出附加的等式

g = fold f v

反过来也是如此,但仅仅通过扩展fold的定义来展示这一点是微不足道的。普遍属性是一个更深层次的属性(这是一种夸张的方式,说明为什么它是真的不太明显。)

这样做很有意思的原因是它可以让你通过归纳来避免证据,这几乎总是值得避免。

答案 1 :(得分:8)

该论文定义了两个属性:

g   []     = v
g (x : xs) = f x (g xs)

然后声明fold不仅是满足这些属性的 函数,而且是满足这些属性的唯一函数。它在这方面的独特之处在于它在纸张使用的意义上使它“普遍”。

答案 2 :(得分:6)

fold具有的属性是它是一个列表递归函数,它等同于所有其他列表递归函数,只要你给它正确的参数。

它具有此属性,因为它接受将作为参数应用于列表中项目的函数。

例如,如果我们写了一个简单的求和函数:

sum []          = 0
sum (head:tail) = head + (sum tail)

然后我们实际上可以把它写成折叠函数,通过传入我们想要用来组合项目的(+)运算符:

sum list = foldl (+) 0 list

因此,任何在列表上简单递归的函数都可以重写为fold函数。等价是它拥有的财产。我相信他称该属性是通用的,因为它适用于所有这些线性列表递归算法,毫无例外。

正如他解释的那样,这个属性如此有用的原因在于,因为我们可以显示所有这些其他算法实际上等同于折叠,通过证明折叠的某些东西,我们也证明了所有其他算法。

我个人发现折叠功能难以理解,所以有时我使用我自己的功能,如下所示:

-- forall - A kind of for next loop
-- list is list of things to loop through
-- f is function to perform on each thing
-- c is the function which combines the results of f
-- e is the thing to combine to when the end of the list is reached
forall :: [a] -> (a->b) -> (b->b->b) -> b -> b
forall [] f c e = e
forall (x:xs) f c e = c (f x) (forall xs f c e)

(这实际上比foldl更强大,因为它具有将函数f应用于列表中每个项目的额外功能。)

没有人证明我的功能。但这没关系,因为我可以证明我的函数实际上是折叠函数:

forall l f c e = foldl c e (map fn l)

因此,所有已被证明折叠的东西,对于我的forall函数以及我整个程序中的所有用途也被证明是正确的。 (注意我们甚至不需要考虑在forall和foldl的每个不同调用中提供什么类型的函数c,这没关系!)

答案 3 :(得分:4)

我刚刚在维基百科上发现了一个新的(对我来说)条目,“Universal Property”。它为这个问题提供了一些亮点。 Here's the link: 从中,我(暂时)得出以下结论:

  1. 虽然您可能会想到100种不同的方式来遍历列表,沿途计算,并从列表中生成一个最终值,但这些方法中的所有100种都是同构(意味着最终,他们是一样的)。实际上只有一种方法可以将列表缩减为一个值,这就是FOLD。
  2. 折叠也是如何将列表减少到单个值的“最有效的解决方案”。或者你可能会说,最“考虑周全”或最“简化”的解决方案。
  3. 看起来,这两点似乎抓住了“普遍财产”一词的含义。

答案 4 :(得分:2)

虽然如果不阅读系列中以前的帖子从分类角度解释通用属性可能会有点难以理解,但这篇文章给出了折叠的通用属性以及地图和过滤器的详细分类说明。 / p>

http://jeremykun.com/2013/09/30/the-universal-properties-of-map-fold-and-filter/

虽然我还没有编写它,但后续内容将概括这一点(并使其更易于理解,虽然更为抽象),以便在通用数据结构上进行“折叠式”操作。

有关通用属性的更多信息,请参阅此帖子:http://jeremykun.com/2013/05/24/universal-properties/

此处提供系列中所有帖子的链接:http://jeremykun.com/main-content/

事实上,目前接受的答案是了解普遍财产对折叠说什么的最简单方法。与上述相关的文章仅通过类别理论提供了更详细的技术描述,该论文在相关论文中不存在。然而,我不同意接受的答案中的陈述,即普遍属性比无术语的陈述更深刻。折叠的普遍属性恰恰是同一个陈述,只是根据用类别理论分析事物的本质,将其装入初始和最终对象的语言中。这种分析很有价值,正是因为它的自然概括。