以下代码有效:
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)
答案 0 :(得分:4)
对于2元组的特殊情况,您可以使用:
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)
但它们不容易理解或更难编写。 Scalas类型推理引擎的功能不足以在最后一种情况下推断出正确的类型,因此如果参数类型不匹配,您通常必须回退以使用模式匹配。
答案 1 :(得分:1)
我认为你遇到的问题是==
不是传统意义上的标准运算符,它是一种方法。它并不以Function2
的形式存在,因此无法用.tupled
调用它来产生您正在寻找的东西。 ((_: String) == (_: String)).tupled
有效,因为 是Function2
。
不确定上述问题是否是您真正需要做的示例或事情,但为了好玩,这也有效:
ls sliding 2 map (_.toSet.size == 1)