我有以下Scala代码示例,我想知道为什么我得到foldLeft一个错误,但不与foldRight?
val xs = List(1,2,3)
val ys = List(4,5,6)
(xs foldLeft ys) (_::_) // Error: Value :: is not a member of Int
(xs foldRight ys) (_::_) // Res: List(1, 2, 3, 4, 5, 6)
我是新来的Scala,所以请您可以回复简单。 谢谢
我有以下Scala代码示例,我想知道为什么我得到foldLeft一个错误,但不与foldRight?
val xs = List(1,2,3)
val ys = List(4,5,6)
(xs foldLeft ys) (_::_) // Error: Value :: is not a member of Int
(xs foldRight ys) (_::_) // Res: List(1, 2, 3, 4, 5, 6)
我是新来的Scala,所以请您可以回复简单。 谢谢
对于操作(功能)的参数传递给foldLeft
和foldRight
处于相反顺序。
因此,在foldLeft
你_ :: _
始于ys :: xs.head
,这没有任何意义。
随着foldRight
,最里面的操作xs.last :: ys
,这是罚款。
该参数顺序更有意义在操作者的版本: z /: ws
推z
righward通过ws
(即foldLeft
),而ws :\ z
推z
向左(即foldRight
)。 和参数的顺序内侧的顺序一致z
与w
以上。
foldLeft和foldRight有不同的签名,他们接受不同的参数
def foldLeft[B](z: B)(op: (B, A) => B): B
def foldRight[B](z: B)(op: (A, B) => B): B
看函数的类型op
的两个。 对于foldLeft左侧的参数是你折(在你的情况下,一个int)收集的类型,而对于foldRight它是结果类型(在你的情况的集合)。
因此,你想,如果你想前置到你的结果列表中的每个后续元素使用foldLeft不同的功能。
总之,操作“::”上没有一个Int,只有集合。 如果您在斯卡拉REPL执行“(XS foldLeft YS)_”,你看,它导致功能
((List[Int], Int) => List[Int]) => List[Int] = <function1>
因此,第一操作数是List [INT]和第二一个Int。 请注意,任何运营商,结束“:”因为它是在使用了左边作为参数右侧操作操作是特殊的。 这就是所谓的“右结合”,而默认的通常“左联”。
因此,“ALIST :: ANINT”翻译成“anInt.::(aList)”,这将导致问题,因为诠释没有一个“::”方法。
在“foldLeft”如果你需要一个左联想功能添加单个元素像“:+”。 因此,这则作品:
(xs foldLeft ys)(_ :+ _)
请注意,结果是从foldRight完全不同的,所以一定要挑到适合您的设备情况。