Scala foldLeft参数签名:o

Scala foldLeft参数签名:o,scala,Scala,为什么第二种方法不起作用?上面说我工会的签名是错误的 但是如果我使用通配符参数,比如union(,),它就会工作。我不能像在第二个例子中那样使用联合吗?foldLeft的定义如下: val s1 = singletonSet(1) val s2 = singletonSet(2) val s3 = singletonSet(3) // works val s = List(s1,s2,s3).foldLeft( union(_,_) ) // error val s = List(s1,s2

为什么第二种方法不起作用?上面说我工会的签名是错误的


但是如果我使用通配符参数,比如
union(,)
,它就会工作。我不能像在第二个例子中那样使用
联合吗?

foldLeft
的定义如下:

val s1 = singletonSet(1)
val s2 = singletonSet(2)
val s3 = singletonSet(3)

// works
val s = List(s1,s2,s3).foldLeft( union(_,_) )

// error
val s = List(s1,s2,s3).foldLeft( union )
第一个参数是“零”,因此首先传递到fold函数的元素(第二个参数)。因此,在第一种情况下,您将函数
union
作为零参数(并且是唯一的参数)传递。添加类型批注时,会变得清晰:

def foldLeft[B](z: B)(op: (B, A) ⇒ B): B
如果只将零参数赋予
foldLeft
(关键字currying),则得到一个函数,将函数作为参数。parameter函数获取列表中元素类型的元素和零参数(因此a
Set
和union类型->
(Set,Set)=>Set
),并返回零参数类型的某些内容(因此在第一种情况下,再次返回类型为
(Set,Set)=>Set
)的函数)

您可能想要的是:

val sU1: (((Set, Set) => Set, Set) => (Set, Set) => Set) => (Set, Set) => Set = List(s1,s2,s3).foldLeft( union(_,_) )
您需要传递一个有效的零参数,然后可以根据需要使用union函数

如果不想提供初始值,另一个选项是
reduceLeft
,它将列表中的第一个元素作为初始值:

val sU2: Set = List(s1,s2,s3).foldLeft(singletonSet(0))(union)

我认为这在你的情况下更有意义。

你说的假论点是什么意思?你说的“她”是指谁?凯蒂在提问时尽量保持一点正式。不需要表情符号等,只会让问题更难理解。同时尽量避免遗漏主题(你对他/她/它的意思并不总是显而易见)。
val sU2: Set = List(s1,s2,s3).foldLeft(singletonSet(0))(union)
val sU3: Set = List(s1,s2,s3).reduceLeft(union)