Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 为什么涉及方法应用程序的连续参数应该用括号括起来?_F# - Fatal编程技术网

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:连续参数应以空格或空格分隔 元组和涉及函数或方法应

假设以下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:连续参数应以空格或空格分隔 元组和涉及函数或方法应用程序的参数 插入括号

修复它很简单(把所有的事情都括起来),但我不清楚的是为什么这样的表达式是一个问题。我假设这又与类型推断有关,但在我看来,天真的是,在这里,有一个括号包围的参数列表的方法实际上会减少潜在的歧义。这是否与
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()
将不起作用