5

我在学。这是我觉得奇怪的事情:

let test_treeways x = match x with
  | _ when x < 0 -> -1
  | _ when x > 0 -> 1
  | _ -> 0;;

如果我这样称呼它:

test_threeways -10;;

我会得到类型不匹配错误(因为据我了解,它将一元减号解释为好像它是部分函数应用程序,所以它认为表达式的类型是int -> int。但是,这是:

test_threeways (-10);;

正如预期的那样(尽管这实际上计算了值,据我所知,它不会将常数“减十”传递给函数。

那么,如何在 OCaml 中编写常量负数呢?

4

2 回答 2

8

您需要将其括起来以避免解析模糊。“test_threeways -10”也可能意味着:从 test_threeways 中减去 10。

并且不涉及功能应用。只需重新定义一元减号,即可查看差异:

#let (~-) = (+) 2 ;; (* See documentation of pervarsives *)
val ( ~- ) : int -> int = <fun>
# let t = -2 ;; 
val t : int = -2 (* no function application, constant negative number *)
# -t ;;
- : int = 0   (* function application *)
于 2013-04-16T16:16:50.980 回答
2

您可以使用~-和 ~-。直接(如另一个答案中所暗示的),它们都是显式前缀运算符,因此解析它们并不模棱两可。但是我更喜欢使用括号。

于 2013-04-19T15:42:41.830 回答