【发布时间】: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 参数“我不确定这里的确切规则”之前用括号括起第一个中缀。但我仍然需要解释。