【问题标题】:Scala: Is it possible to get partially applied function from leftfold?Scala:是否可以从 leftfold 获得部分应用的功能?
【发布时间】:2015-03-02 14:42:48
【问题描述】:

我目前正在学习 Scala,我只是想知道 fold-left。 由于 fold-left 是柯里化的,你应该能够得到一个带有第一个参数的部分应用函数(PAF),如下所示。

(0 /: List(1, 2, 3)) _

但实际上,我有一个错误。

<console>:8: error: missing arguments for method /: in trait TraversableOnce;
follow this method with `_' if you want to treat it as a partially applied function

然后我通过右折叠尝试了同样的事情,如下所示

(List(1, 2, 3) :\ 0) _

通过这种方式,它运行正确,我可以得到一个 PAF,例如 ((Int, Int) => Int) => Int

我知道我可以使用 foldLeft 方法得到一个 PAF,但我想知道是否可以用 '/:' 表示它。

【问题讨论】:

  • 可能是由于运算符的关联,因为它涉及右侧的冒号。尝试将下划线移到左侧。
  • 你也可以只使用 foldLeft。
  • 应该避免使用 /: 和 :\,而不是更明确的 foldLeft 和 foldRight。您可能想阅读这份官方风格指南:docs.scala-lang.org/style/method-invocation.html

标签: scala partialfunction foldleft


【解决方案1】:

下划线语法不适用于采用多个参数列表的右关联方法。以下是我看到的选项:

  1. 声明一个变量类型:

    val x: ((Int, Int) => Int) => Int =  0 /: List(1, 2, 3)
    
  2. 同样,使用类型归属:

    val x = (0 /: List(1,2,3)) : ((Int, Int) => Int) => Int
    
  3. 使用后缀表示法:

    val x = List(1,2,3)./:(0) _
    
  4. 使用foldLeft 同义词:

    val x = List(1,2,3).foldLeft(0) _
    

【讨论】:

    【解决方案2】:

    我玩过它,但找不到有效的配置。

    总是有更明确的:

    val f = List(1,2,3,4,5).foldLeft(0)_
    

    这可以说是更整洁。不过我会继续四处寻找。

    编辑:

    有这个:

    val f2 = (0 /: List(1,2,3,4,5))(_: (Int,Int) => Int)
    val x = f2(_+_)
    

    但这越来越难看。没有类型注释,它会抱怨。这是我能做的最好的了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2013-02-24
      • 1970-01-01
      相关资源
      最近更新 更多