以下代码有效:
val ls = Seq("a", "b", "b", "c")
def strEq(a: String, b: String) = a == b
val detectChange = (ls zip ls.tail).map((strEq _). tupled)
是否可以直接使用标准运算符而不是创建 strEq,类似的东西?
val detectChange = (ls zip ls.tail).map(== _. tupled)
最佳答案
对于二元组的特殊情况,您可以使用:
scala> val ls = Seq("a", "b", "b", "c")
ls: Seq[String] = List(a, b, b, c)
scala> (ls, ls.tail).zipped.map(_ == _)
res0: Seq[Boolean] = List(false, true, false)
其他变体是
scala> (ls zip ls.tail).map{case (a,b) => a == b}
res2: Seq[Boolean] = List(false, true, false)
scala> (ls zip ls.tail).map{((_: String) == (_: String)).tupled}
res5: Seq[Boolean] = List(false, true, false)
scala> (ls zip ls.tail).map(((_ == _): ((String, String) => Boolean)).tupled)
res0: Seq[Boolean] = List(false, true, false)
但它们并不更容易理解或更容易编写。 Scala 类型推断引擎不够强大,无法在最后一种情况下推断出正确的类型,因此,如果参数类型不匹配,您通常必须回退到使用模式匹配。
关于scala - 标准运算符可以被元组化或柯里化(Currying)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38526242/