gpt4 book ai didi

f# - 为什么涉及方法应用程序的连续参数应该用括号括起来?

转载 作者:行者123 更新时间:2023-12-03 22:26:16 25 4
gpt4 key购买 nike

假设以下 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 不起作用,并带有明确的错误消息:

error FS0597: Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized.



修复它是微不足道的(把所有东西都加括号),但我不清楚的是为什么这样的表达式是一个问题。我认为这再次与类型推断有关,但天真地,在我看来,在这里,具有括号包围的参数列表的方法实际上会使事情不那么潜在的歧义。这是否与 rng.Next(5) 的事实有关?相当于 rng.Next 5 ?

有人可以提示、举例或解释为什么需要这条规则,或者如果没有它会出现什么类型的问题?

最佳答案

我认为这里的问题是代码可以被视为:

let z3 = f 1 rng.Next (5)

这相当于省略了括号,因此它会调用 f有 3 个参数(第二个是函数值)。这听起来有点傻,但编译器实际上并没有严格要求参数之间有空格。例如:
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()不管用。

关于f# - 为什么涉及方法应用程序的连续参数应该用括号括起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com