在OCaml中查找整数的符号

时间:2014-07-18 10:34:02

标签: ocaml sign

我们可以在不使用二进制运算的情况下找到OCaml中的符号吗?我的意思是通过与0比较很容易得到标志。除了使用与命令匹配之外还有其他方法吗?我尝试了以下

let sign n =
    let k = abs(n) in
    match k with
    | 0 -> 0
    | n -> 1
    | _ -> (-1);;

但它不适用于负面因素,因为它表明最后的比较未被使用。 :/

3 个答案:

答案 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;;