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函数获取列表中元素类型的元素和零参数(因此aSet
和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)