斯卡拉:值::是不是Int的成员(Scala: Value :: is not a member o

2019-10-23 16:27发布

我有以下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,所以请您可以回复简单。 谢谢

Answer 1:

对于操作(功能)的参数传递给foldLeftfoldRight处于相反顺序。

因此,在foldLeft_ :: _始于ys :: xs.head ,这没有任何意义。

随着foldRight ,最里面的操作xs.last :: ys ,这是罚款。

该参数顺序更有意义在操作者的版本: z /: wsz righward通过ws (即foldLeft ),而ws :\ zz向左(即foldRight )。 和参数的顺序内侧的顺序一致zw以上。



Answer 2:

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不同的功能。



Answer 3:

总之,操作“::”上没有一个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完全不同的,所以一定要挑到适合您的设备情况。



文章来源: Scala: Value :: is not a member of Int