标准操作员可以是笨蛋还是咖喱?

时间:2016-07-22 12:18:09

标签: scala function operators tuples

以下代码有效:

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)

2 个答案:

答案 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)