如果我在OCaml中定义一个函数,例如let f x = x + 1;;
然后我尝试调用它传递一个负数,
f -1;;
它给我以下错误
Error: This expression has type int -> int but an expression was expected of type int
为什么会出现此错误?
基本上,它来自解析器的优先级.编译器认为,f -1
意味着你要减去f
的1
.它已被抱怨多年了.
输入f (-1)
或f ~-1
将解决您的问题(后者使用"明确的一元减号").
更新:
如OCaml手册中所述:
一元否定.你也可以写--e而不是〜 - e.
基本上,-
既可以用作二元运算符,也可以用作4 - 1
一元运算符-1
.但是,就像你的情况一样,可能存在混淆:f - 1
是"f减1"而不是"f应用于减1".所以~-
操作员被添加到一个非混乱的一元减号.
请注意,空格在这里并不重要,并且不会更改,因为许多现有代码可能包含没有空格的操作.