【问题标题】:Scala: Is operator foldl infix?Scala:运算符 foldl 是中缀吗?
【发布时间】:2013-03-25 17:49:28
【问题描述】:

foldl看代码很难理解它的语法,例如:

  def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ):Map[String, Int] = {
    (map /: lst) (addToMap)
  }

/: 是中缀运算符吗? (map /: lst) 是什么意思,部分应用?为什么我不能这样打电话:

`/:  map lst addToMap`

【问题讨论】:

    标签: scala fold


    【解决方案1】:

    : 字符结尾的方法名称可以用在它们绑定到的实例的左侧(即,它们关联到右侧)。在这种情况下,/:method on List。根据 Scaladoc:

    注意:/: 是 foldLeft 的替代语法; z /: xs 与 xs foldLeft z 相同。

    您所写的替代方案是:

    lst./:(map)(addToMap)
    

    编辑:和 foldLeft 的另一种选择:

    lst.foldLeft(map)(addToMap)
    

    【讨论】:

    • Kristian,@DaoWen,据我所知foldLeft 有两个参数 - 初始值和折叠函数。那为什么lst.foldLeft(map, addToMap)会导致错误too many arguments for method foldLeft: (z: B)(f: (B, (String, Int)) => B)B
    • foldLeft 有两个参数组(如两组括号所示) - 第一组需要一个参数,这是错误消息的原因。第二个参数属于第二组。我用foldLeft 的例子编辑了答案。如您所见,它实际上是 /: 的直接替代品
    • 克里斯蒂安,谢谢!在哪里阅读有关 Scala 函数参数组的信息?到目前为止在文档中找不到这个...
    • 它在 Scala 规范 (scala-lang.org/docu/files/ScalaReference.pdf) 的第 4.6 节中正式定义,并且在这个问题中有一些更非正式的讨论:stackoverflow.com/questions/6803211/…
    【解决方案2】:

    是的,/: 可以用作中缀运算符。但是,fold 操作需要 三个 参数:

    1. 要折叠的序列
    2. 减少的初始值
    3. 用于折叠的函数

    使用中缀你只能指定这三个参数中的两个:序列(即接收者)和初始值。 (map /: lst) 是部分应用程序这一事实反映了您仍然缺少参数的事实。下面是一个数字序列的乘积示例,从初始值 1 开始:

    (1 /: xs)(_*_)
    

    由于 Scala 支持函数字面量的花括号,您还可以使用它来使函数参数看起来更像函数体:

    (1 /: xs) { (x, y) =>
        x * y
    }
    

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2011-11-28
      • 1970-01-01
      • 2018-01-24
      • 2017-01-25
      • 1970-01-01
      相关资源
      最近更新 更多