【问题标题】:Calling a curried method in Scala在 Scala 中调用柯里化方法
【发布时间】:2015-08-15 22:10:03
【问题描述】:

当我定义一个柯里化函数时:

def fx(x: Int) (f: Int => Int): Int = f(x)

我可以这样称呼它:

fx(2)(x => x * x)

但不能使用:

(fx 2) (x => x * x)

然而

如果我们从 scala std 库中获取 foldLeft 的乐趣,带有签名:

def foldLeft[B](z: B)(f: (B, A) => B): B

我可以这样称呼它:

(xs foldLeft 0 ) ( _ + _)

但不能使用:

xs foldLeft (0) ( _ + _)

问题:

为什么如果我定义的乐趣,我可以用f(x)(fx)调用它,但不能用(f x)(fx)调用它,但是如果是foldleft,我可以用(obj f x)(fx)调用它,但不能用它调用它obj f (x) (fx)?

提示:我知道这是因为运算符优先级,但需要详细回答

【问题讨论】:

  • 这与运算符优先级无关
  • 来自@Daniel C. Sobral 关于上述问题,我可以理解两件事(与我的案例有关),1. 中缀仅在对象是等式的一部分时才有效(因此(fx 2)无效) 2. 对于 curried 函数(foldLeft),我必须在应用发送 curried 参数“我不确定这里的确切规则”之前用括号括起第一个中缀。但我仍然需要解释。

标签: scala currying


【解决方案1】:

在您的示例中,您没有在中缀位置使用fx中缀中的函数或运算符需要在函数或运算符的左侧调用此函数的实例,并在右侧调用参数。

例子:

(xs foldLeft 0 ) ( _ + _)

foldLeft(infix) 在 xs(左)上调用 - 这是一些 Collection - 将 0(右)作为参数传递。

在你的例子中:

(fx 2) (x => x * x)

调用对象fx 丢失。如果你稍微改变一下你的例子,它就会起作用:

object someInstance {
  def fx(x: Int)(f: Int => Int): Int = f(x)

  val test = (this fx 2) (x => x * x)
}

// OR
val test2 = (someInstance fx 2) (x => x * x)

它会起作用的。

【讨论】:

  • 好的,这部分很清楚(请参阅我的 cmets 问题)-感谢@sschaef,另一部分呢?
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 2018-01-24
  • 2021-02-07
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多