OCaml字面负数?

时间:2013-04-16 15:45:06

标签: syntax ocaml

我正在学习。这是我发现奇怪的事情:

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中编写常数负数?

2 个答案:

答案 0 :(得分: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 *)

答案 1 :(得分:1)

您可以使用~-和〜 - 。直接(如在另一个答案中暗示的那样),它们都是明确prefix operators所以解析它们并不含糊。 但我更喜欢使用括号。