scala - 标准运算符可以被元组化或柯里化(Currying)吗?

标签 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)

最佳答案

对于二元组的特殊情况,您可以使用:

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/

相关文章:

syntax - 为什么作为高优先级运算符的原子不需要圆括号?

c++ - 以下代码如何在 C/C++ 中编译?

angularjs - 为什么我应该在我的 sbt playframework 项目中使用前端插件?

scala - 如何处理Reader[A, Future[B]]

scala - 即使文件明确存在,SBT 也无法在存储库中找到

linux - Bash 函数中的 Cd

c++ - 为什么我的虚拟函数未分配值?

python - 如何使用函数中的参数来定义要在函数中使用的数据框的名称?

c - *p 和 *&p 有什么区别

scala - 在dispatch-classic中使用cookie