我们可以在不使用二进制运算的情况下找到OCaml中的符号吗?我的意思是通过与0比较很容易得到标志。除了使用与命令匹配之外还有其他方法吗?我尝试了以下
let sign n =
let k = abs(n) in
match k with
| 0 -> 0
| n -> 1
| _ -> (-1);;
但它不适用于负面因素,因为它表明最后的比较未被使用。 :/
答案 0 :(得分:4)
与模式n
进行模式匹配不会将值与现有变量n
的值进行比较。它绑定n
块中的新变量->
。旧变量n
继续存在并保持其值,但暂时无法访问该名称。
因此,match … with n -> …
总是成功,因为任何表达式都是n
形式的新变量n
。
match
构造不适合识别整数的符号。你最好只写if n > 0 then 1 else if n < 0 then -1 else 0
。
答案 1 :(得分:1)
如果您想使用模式匹配,可以尝试:
let sign n =
match n with
| 0 -> 0
| _ -> (n / abs(n));
这返回0表示0,-1表示负数,+1表示正数
答案 2 :(得分:1)
您的模式匹配技巧不起作用,因为模式| n ->
不会将您的值与n进行比较,而是创建一个绑定到k的新n。
一个简单的解决方法是使用compare
函数。它没有这样指定,但确实以这种方式工作:
let sign n = compare 0 n;;