F# 奇怪的表达式解析行为

F# 奇怪的表达式解析行为,f#,F#,在此代码中: let f(a,b,c) = a * b + c - (d()) let g(a,b,c) = a * b + c -(d()) f是(int*int*int)->int,g是(int*int*(int*int))->int 删除g中d()周围的括号会导致“连续参数应以空格或元组分隔”错误 发生了什么事?@bytebuster的评论非常正确,但用外行的话来说;-]一个被解析为二进制减法运算符,另一个被解析为一元求反运算符——这里你只是在与运算符优先级作斗争。c-d()意味着d()

在此代码中:

let f(a,b,c) = a * b + c - (d())
let g(a,b,c) = a * b + c -(d())
f
(int*int*int)->int
g
(int*int*(int*int))->int

删除
g
d()
周围的括号会导致“连续参数应以空格或元组分隔”错误


发生了什么事?

@bytebuster的评论非常正确,但用外行的话来说;-]一个被解析为二进制减法运算符,另一个被解析为一元求反运算符——这里你只是在与运算符优先级作斗争。

c-d()
意味着
d()|>(~-)|>c
我只是认为它不值得一个完整的答案:)而且,因为它几乎不能帮助任何进一步的访问者,Q将很快被删除。@bytebuster这太荒谬了。大多数语言,包括像Haskell这样的相关语言,将同样解析
f
g
。F#显然是个例外,因为空格不仅在缩进中很重要,而且显然在前缀运算符中也很重要。@ReiMiyasaka:大多数语言(尽管可能不是大多数函数语言)单独处理
-N
-N
@bytebuster非常不同。解析器在这里似乎仍然处理相同的文本和标识符,只是在类型推断过程中产生了错误
让Haskell中的fab=a-b
仍然是
numa=>a->a->a
,除非
-b
被括起来,而在f#中,它是
(int->a)->int->a
。使用空格作为固定性的表示是一种常见的约定,但这不是我尝试过的任何其他语言的规则。从任何角度来看,这都是令人惊讶的行为,我也不是“打字错误”。@bytebuster这个问题也完全没有本地化。我给出的示例使用了一种在任何代码中都可能出现的非常通用的形式。中缀运算符前面有空格,后面没有空格并不少见,这确实可能是一个非常简单的输入错误,会产生非常混乱且似乎不相关的类型错误。你只是碰巧一开始认为它是本地化的,因为你认为它只是我会做的一个打字错误,而事实上,正如我所展示的,它是一个F#已经偏离的公认的符号,所以它根本不是一个单一的打字错误。