Scala:如何创建一个允许我在调用时使用点符号的函数?

标签 scala this infix-notation method-invocation

尽管阅读了 the Scala Style Guide - Method Invocation,但我对此感到困惑了一段时间。几次。

我希望能够调用这个方法

def foldRVL[A,B](l: List[A], z: B)(f: (A, B) => B) = //"Right-Via-Left"
  l.reverse.foldLeft(z)((a, b) => f(b, a))

使用像这样的点符号 List(1,2,3).foldRVL(0)(_ + _)

而不是像这样:foldRVL(List(1,2,3), 0)(_ + _)

此外,有时我看到代码显示的方法实际上要么在其签名中采用零参数,要么比我期望的参数少一个,但仍然使用点符号正确地采用参数。这是如何运作的?我问这个是因为这些方法使用点符号,所以也许如果我写类似的东西我可以解决我的问题。

最佳答案

对于问题的第一部分,您可能需要查看 implicit classes :

  implicit class RichRVLList[A](l:List[A]) {
    def foldRVL[B](z: B)(f: (A, B) => B) = //"Right-Via-Left"
      l.reverse.foldLeft(z)((a, b) => f(b, a))
  }

  List(1,2,3).foldRVL(1)(_ + _)  // output: res0: Int = 7

您可以使用隐式包装器“丰富”现有类以“添加”新方法。

至于第二部分,可能你想要implicit parameters .隐式参数是按类型从当前范围推导出来的。下面的示例中使用了一些预定义的隐式值,例如 Numerics:

  def product[T](els:TraversableOnce[T])(implicit num:Numeric[T]) = {
    els.fold(num.one)((x1, x2) => num.times(x1, x2))
  }      

  product(List(1, 2, 3)) // res1: Int = 6
  product(List(1, 2.5, 3)) //res2: Double = 7.5

关于Scala:如何创建一个允许我在调用时使用点符号的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31621321/

相关文章:

Scala:部分评估函数并缓存固定值

forms - Play Framework - 使用表单助手时如何更改输入的标签?

javascript - 使用 jQuery 代理时保留两个 `this` 引用

java - 后缀到中缀

scala - 改进 Intellij IDEA 中的 Scala 代码编译时间

scala - Scala 中的混入

c# - "this"运算符(operator)不工作

javascript - 将此对象添加到数组中

design-patterns - 是否可以向 Scala 中的内置类型添加方法?

function - Haskell 中的运算符和函数优先级