Ant*_*oly 5 scala equivalent fold
在一个在线课程中,它表明foldLeft并且foldRight对于具有关联性和可交换性的运算符是等效的.
其中一名学生坚持认为这些操作员只需要联想.因此,对于函数组合和矩阵乘法等操作,此属性应该为true.
据我所知,不可交换的关联操作不会产生等效的结果foldLeft,foldRight除非z是中性的,并且操作以这样的方式累积,即操作数的顺序保持不变.在一般情况下,IMO的操作必须是可交换的.
list.foldLeft(z)(operation) == list.foldRight(z)(operation)
Run Code Online (Sandbox Code Playgroud)
因此,为了foldLeft和foldRight等同应该operation是同时联想和可交换的,还是足以operation成为联想的?
String连接("abc"+"xyz")是关联的但不是可交换的,并且foldLeft/ foldRight它将初始/零元素放在结果字符串的两端.如果该零元素不是空字符串,则结果不同.
该功能必须是可交换的和关联的。
如果我们的功能f,我们的元素x1来x4,那么:
foldLeft是 f(f(f(x1, x2), x3), x4)
foldRight是 f(x1, f(x2, f(x3, x4)))
让我们使用平均值函数,它是可交换的,而不是可关联的((a + b) / 2 == (b + a) / 2):
scala> def avg(a: Double, b: Double): Double = (a + b) / 2
avg: (a: Double, b: Double)Double
scala> (0 until 10).map(_.toDouble).foldLeft(0d)(avg)
res4: Double = 8.001953125
scala> (0 until 10).map(_.toDouble).foldRight(0d)(avg)
res5: Double = 0.9892578125
Run Code Online (Sandbox Code Playgroud)
编辑:我错过了只在关联与仅可交换的船。请参阅@jwvy的字符串连接示例,以获取关联但不交换的功能。
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |