我正在学习。这是我发现奇怪的事情:
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中编写常数负数?
答案 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所以解析它们并不含糊。 但我更喜欢使用括号。