reduceLeft(或 foldLeft)与 scala 中的 reduceRight(或 foldRight)

问题描述 投票:0回答:1

我正在从 coursera 学习 scala。在

reduceLeft
reduceRight
的描述中出现了:

然后在下一张幻灯片上,老师说这个代码模式被抽象为

reduceLeft

我的问题:

  1. 我认为第一张幻灯片中的模式是
    reduceRight
    而不是
    reduceLeft
    。你能帮我理解我错在哪里吗?例如:
    [1,2,3]
    上的加法运算符会导致第一张幻灯片中的
    (1+sum(2,3))
    ,我认为这是 reduceRight。 reduceLeft 应该是
    (sum(1,2)+3)
  2. 我无法实施
    reduceLeft
    ,因为
    reduceRight
    是在第一张幻灯片中使用
    case
    语句原始实施的?你能指导我正确的方向吗?
scala fold foldleft
1个回答
0
投票

Re 1.:

事实上,正如评论中已经确认的那样,第一张幻灯片中的模式是

reduceLeft

我认为第二张幻灯片的重点是说“可以使用标准库中的通用方法抽象出减少列表的模式”(而不是“前面幻灯片中的特定解决方案的模式对应于

foldLeft
").

reduceLeft
reduceRight
都适合实施
sum
。但是:当
reduceLeft
/
reduceRight
(或
foldLeft
/
foldRight
)都适合解决方案时,在 Scala 中通常更喜欢
Left
变体(尤其是在使用
List
s 时),因为它的实现在
List
s 上稍微更有效率。这无疑是关注第二张幻灯片上
reduceLeft
的动机。

Re 2.:

如果要实现第一张幻灯片的

sum
左缩减,需要三种情况:

def sum(xs: List[Int]): Int = xs match
  case Nil            => 0
  case x :: Nil       => ???
  case x :: y :: tail => ??? 

我留给你填写

???
s.

请注意,不可能以尾递归方式实现此左缩减

sum
(除非您引入具有不同签名的附加辅助函数)。

© www.soinside.com 2019 - 2024. All rights reserved.