F# 为什么涉及方法应用程序的连续参数应该用括号括起来?
假设以下F#函数:F# 为什么涉及方法应用程序的连续参数应该用括号括起来?,f#,F#,假设以下F#函数: let f (x:int) (y:int) = 42 我怀疑我需要在下面的示例z2中插入参数的原因是因为类型推断;我的例子可能不太好,但很容易想象事情会变得非常棘手: let z1 = f 2 3 let z2 = f 2 (f 3 5) 然而,我不太清楚以下情况: let rng = System.Random() let z3 = f 1 rng.Next(5) z3不工作,有一条清晰的错误消息: 错误FS0597:连续参数应以空格或空格分隔 元组和涉及函数或方法应
let f (x:int) (y:int) = 42
我怀疑我需要在下面的示例z2中插入参数的原因是因为类型推断;我的例子可能不太好,但很容易想象事情会变得非常棘手:
let z1 = f 2 3
let z2 = f 2 (f 3 5)
然而,我不太清楚以下情况:
let rng = System.Random()
let z3 = f 1 rng.Next(5)
z3不工作,有一条清晰的错误消息:
错误FS0597:连续参数应以空格或空格分隔
元组和涉及函数或方法应用程序的参数
插入括号
修复它很简单(把所有的事情都括起来),但我不清楚的是为什么这样的表达式是一个问题。我假设这又与类型推断有关,但在我看来,天真的是,在这里,有一个括号包围的参数列表的方法实际上会减少潜在的歧义。这是否与rng.Next(5)
等同于rng.Next 5
这一事实有关
有人可以提示、举例或解释为什么需要这个规则,或者如果没有它会出现什么类型的问题吗?我认为这里的问题是代码可以被视为:
let z3 = f 1 rng.Next (5)
这相当于省略括号,因此它将使用3个参数(第二个是函数值)调用f
。这听起来有点傻,但编译器实际上并不严格要求在参数之间留有空格。例如:
let second a b = b
add 5(1) // This works fine and calls 'add 5 1'
add id(1) // error FS0597
add rng.Next(5) // error FS0597
add (rng.Next(5)) // This works fine (partial application)
我认为问题在于,如果您查看上述代码段中4个示例的顺序,就不清楚在第二种和第三种情况下应该采取哪种行为
调用rng.Next(5)
仍然以一种特殊的方式处理,因为如果调用是由单参数应用程序无空格形成的,则F#允许您链接调用。例如rng.Next(5).ToString()
。但是,例如,允许写入second(1)(2)
,但是second(1)(2)。ToString()
将不起作用