Functional programming 请尽可能用最简单、最专业的英语解释;“折叠”的普遍性质;?

Functional programming 请尽可能用最简单、最专业的英语解释;“折叠”的普遍性质;?,functional-programming,fold,haskell,Functional Programming,Fold,Haskell,我正在通过“真实世界Haskell”工作,这导致了一个名为。它指出“折叠”是“通用的”。我正在绞尽脑汁思考他对“普遍性”的定义,并想听听那些已经投入时间去理解它的人的意见:请用最简单、最不需要行话的英语解释“折叠的普遍性”?这一“普遍性”是什么,为什么重要 谢谢。本文定义了两个属性: g [] = v g (x : xs) = f x (g xs) 然后指出,fold不仅是一个满足这些属性的函数,而且是唯一满足这些属性的函数。在这方面它是独一无二的,这就是为什么它在论文使用的意义上

我正在通过“真实世界Haskell”工作,这导致了一个名为。它指出“折叠”是“通用的”。我正在绞尽脑汁思考他对“普遍性”的定义,并想听听那些已经投入时间去理解它的人的意见:请用最简单、最不需要行话的英语解释“折叠的普遍性”?这一“普遍性”是什么,为什么重要


谢谢。

本文定义了两个属性:

g   []     = v
g (x : xs) = f x (g xs)
然后指出,
fold
不仅是一个满足这些属性的函数,而且是唯一满足这些属性的函数。在这方面它是独一无二的,这就是为什么它在论文使用的意义上是“通用的”。

(行话模式关闭:-)

普适性只是证明两个表达式相等的一种方法。(这就是术语“证明原则”的意思。) 宇宙属性说,如果你能证明这两个方程

g []     = v
g (x:xs) = f x (g xs)
然后你可以得出附加方程式

g = fold f v
反之亦然,但仅通过扩展
fold
的定义就可以看出这一点。宇宙属性是一个更深层次的属性(这是一种行话,表示它为什么是真的不太明显。)


之所以这么做很有趣,是因为它让你避免了归纳法证明,这几乎总是值得避免的。

fold的特性是它是一个列表递归函数,如果你给它正确的参数,它与所有其他列表递归函数是等价的

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

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

sum []          = 0
sum (head:tail) = head + (sum tail)
forall l f c e = foldl c e (map fn l)
然后,我们实际上可以将其作为折叠函数来编写,方法是传入(+)运算符,我们要使用它来组合项目:

sum list = foldl (+) 0 list
因此,任何简单且递归地作用于列表的函数都可以重写为折叠函数。这种等价性就是它所拥有的属性。我相信他把这个属性称为通用属性,因为它毫无例外地适用于所有这些线性列表递归算法

正如他所解释的,这个性质之所以如此有用,是因为我们可以证明所有其他算法实际上都等价于fold,通过证明fold,我们也可以证明所有其他算法

我个人觉得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应用于列表中每个项目的额外功能。)

没有人证明我的功能。但这并不重要,因为我可以证明我的函数实际上是一个折叠函数:

sum []          = 0
sum (head:tail) = head + (sum tail)
forall l f c e = foldl c e (map fn l)
因此,关于fold的所有已经被证明的东西,对于我的forall函数,以及它在我的程序中的所有用途,也都被证明是正确的。(注意,我们甚至不需要考虑在FALWALL和FOLDL的每个调用中提供了什么样的函数C,这没关系!)< /P> < P>我刚刚在维基百科中找到了一个新的(“我”)条目“通用属性”。这对这个问题有很大的帮助。 从中,我(理所当然地)得出以下结论:

  • 虽然您可能会想到100种不同的方法来遍历列表,一路计算,并从列表中生成一个最终值,但所有100种方法都是同构的(这意味着最终它们是相同的)。实际上,只有一种方法可以将列表缩减为一个值,那就是折叠
  • 折叠也是如何将列表缩减为单个值的“最有效的解决方案”。或者你可能会说,最“考虑因素”或最“简化”的解决方案
    这两点合在一起似乎抓住了术语“普遍属性”的含义。

    虽然如果不阅读本系列先前的文章,从分类的角度解释普遍属性,可能有点难以理解,但这篇文章对褶皱的普遍属性进行了详细的分类解释,以及映射和过滤

    虽然我还没有写它,但接下来将把它推广到一般数据结构上的“折叠”操作(并使其更容易理解,尽管更抽象)

    有关什么是通用属性的更多信息,请参阅本文:

    以下是本系列所有帖子的链接:


    事实上,目前公认的答案是理解宇宙属性对褶皱的解释的最简单的方法。与上述相关的文章只是通过范畴理论给出了更详细的技术描述,这在相关论文中是不存在的。不过,我不同意公认答案中的说法,即普遍性比无术语的说法要深刻得多。根据范畴论分析事物的本质,fold的普遍性正是同一种表述,只是被禁锢在最初对象和最终对象的语言中。这种分析之所以有价值,正是因为它是自然的概括。

    论文中还有一个概念,大致如下:,“只有一种方法可以从右侧折叠并应用功能。那条路就是福尔德。如果你有一些你认为不同的方法,仔细看,你会发现它没有什么不同,因为只有一种方法存在。“至少,我想我读到的是:)。我需要更多的重新阅读。我说的是对的还是大概的?如果是这样,这与宇宙属性有什么关系?谢谢。查理,我想我没有弄错那部分。查理,我想那是对的,是的。universal属性很好,因为它允许您根据fold重写适当类型的递归定义