2014-07-18 37 views
0

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

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

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

回答

1

如果你想使用模式匹配,你可以尝试:

let sign n = 
    match n with 
    | 0 -> 0 
    | _ -> (n/abs(n)); 

这为0返回0,-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

你的模式匹配招不工作模式| n ->不会将您的值与n进行比较,而是创建一个绑定到k的新n。

一个简单的解决方法是使用compare函数。它不是这样规定的,但实际上是这样工作的:

let sign n = compare 0 n;;