Functional programming 高阶函数foldl和foldr的实际例子是什么?

Functional programming 高阶函数foldl和foldr的实际例子是什么?,functional-programming,fold,catamorphism,Functional Programming,Fold,Catamorphism,典型的学术例子是总结一份清单。 有没有真实世界中使用折叠的例子可以说明其用途?折叠可能是序列上最基本的操作。要求它的实用性就像在命令式语言中要求for循环的实用性一样 给定一个列表(或数组、树或..)、一个起始值和一个函数,fold操作符将列表缩减为单个结果。它也是列表的自然(析构函数) 任何将列表作为输入并在检查列表元素后生成输出的操作都可以编码为折叠。例如 sum = fold (+) 0 length = fold (λx n → 1 + n) 0 reverse =

典型的学术例子是总结一份清单。
有没有真实世界中使用折叠的例子可以说明其用途?

折叠可能是序列上最基本的操作。要求它的实用性就像在命令式语言中要求
for
循环的实用性一样

给定一个列表(或数组、树或..)、一个起始值和一个函数,
fold
操作符将列表缩减为单个结果。它也是列表的自然(析构函数)

任何将列表作为输入并在检查列表元素后生成输出的操作都可以编码为折叠。例如

sum      = fold (+) 0

length   = fold (λx n → 1 + n) 0

reverse  = fold (λx xs → xs ++ [x]) []

map f    = fold (λx ys → f x : ys) []

filter p = fold (λx xs → if p x then x : xs else xs) []
折叠运算符不特定于列表,但可以以统一的方式概括为“常规”数据类型

因此,作为对各种数据类型最基本的操作之一,它确实有一些用途。能够识别何时可以将算法描述为折叠是一项有用的技能,这将导致代码更清晰


参考资料:


折叠
可能是序列上最基本的操作。要求它的实用性就像在命令式语言中要求
for
循环的实用性一样

给定一个列表(或数组、树或..)、一个起始值和一个函数,
fold
操作符将列表缩减为单个结果。它也是列表的自然(析构函数)

任何将列表作为输入并在检查列表元素后生成输出的操作都可以编码为折叠。例如

sum      = fold (+) 0

length   = fold (λx n → 1 + n) 0

reverse  = fold (λx xs → xs ++ [x]) []

map f    = fold (λx ys → f x : ys) []

filter p = fold (λx xs → if p x then x : xs else xs) []
折叠运算符不特定于列表,但可以以统一的方式概括为“常规”数据类型

因此,作为对各种数据类型最基本的操作之一,它确实有一些用途。能够识别何时可以将算法描述为折叠是一项有用的技能,这将导致代码更清晰


参考资料:


    • 我蹩脚的回答是:

      • foldr用于将问题简化为基本情况,然后重新组装(表现为非尾部递归)
      • foldl用于减少问题并在每一步组装解决方案,在原始情况下,您可以准备好解决方案(bahaves作为尾部递归/迭代)
      这个问题立刻让我想起了拉尔夫·勒梅尔(Ralf Lämmel)的一次谈话(因为rfold运算符符号看起来像香蕉(| and |))。有很多例子可以说明如何将递归映射到折叠,甚至一个折叠映射到另一个折叠


      经典论文(一开始很难)是以其他操作符的外观命名的。

      我蹩脚的回答是:

      • foldr用于将问题简化为基本情况,然后重新组装(表现为非尾部递归)
      • foldl用于减少问题并在每一步组装解决方案,在原始情况下,您可以准备好解决方案(bahaves作为尾部递归/迭代)
      这个问题立刻让我想起了拉尔夫·勒梅尔(Ralf Lämmel)的一次谈话(因为rfold运算符符号看起来像香蕉(| and |))。有很多例子可以说明如何将递归映射到折叠,甚至一个折叠映射到另一个折叠

      经典论文(一开始很难)是以其他操作符的外观命名的。

      列出了以下函数:

      • 总数
      • 产品
      • 计数
      • 平均值
      • 最后
      • 倒数第二
      • 包含
      • 得到
      • 逆转
      • 独特的
      • 设置
      • 双重的
      • 插入排序
      • 枢轴(快速排序的一部分)
      • 编码(计数连续元素)
      • 解码(生成连续元素)
      • 分组(分成大小相等的子列表)
      列出了以下功能:

      • 总数
      • 产品
      • 计数
      • 平均值
      • 最后
      • 倒数第二
      • 包含
      • 得到
      • 逆转
      • 独特的
      • 设置
      • 双重的
      • 插入排序
      • 枢轴(快速排序的一部分)
      • 编码(计数连续元素)
      • 解码(生成连续元素)
      • 分组(分成大小相等的子列表)

      你是说在现实世界中你从来不需要计算列表的总和吗?我使用python,所以要计算列表的总和,我只需要做
      sum(alist)
      。因此,我通常不需要运行fold(或者python中的
      reduce
      )来实现相同的效果。Python没有这种内置功能。当然,这只是另一个非常简单的例子。每次你有一个for循环,其中主体由重新分配一个变量组成,你可以用fold替换它。其他例子有:查找最小值、最大值、构建树或散列映射(从键值对列表中)几乎任何处理集合元素以构建依赖于所有元素的结果的计算都可以表示为某种折叠。折叠函数的实用性并不在于它们自然地表达了一些特定的具体例子;最自然的混凝土褶皱可以用其他技术简单地重写。实用程序是,你不必编写每一个不同的简单示例,因为折叠涵盖了所有这些示例。你是说你在现实世界中不必计算列表的和吗?我使用python,所以要对列表求和,我只需执行
      sum(alist)
      。因此,我通常不需要运行fold(或者python中的
      reduce
      )来实现相同的效果。Python没有这种内置功能。当然,这只是另一个非常简单的例子