2011-12-18 42 views
1

我有以下的升F功能麻烦:FSharp选项和空

let compare (a:int option list) (b:int option list) =   
let r = 
    if a.Tail = [None] && b.Tail = [None] then 
     [None] 
    elif a.Tail = [None] then 
     [b.Head;None] 
    elif b.Tail = [None] then 
     [a.Head; None] 
    else 
     if a=b then 
      a 
     else 
      [None] 
r 

当我用下面的参数运行它

compare [Some 1] [Some 0] 

答案是

[null] 

而不是

[None] 

有人可以解释为什么;谢谢!

+0

比较,您最好不要重新定义它,因为它已经存在。 – BLUEPIXY 2011-12-18 21:38:54

回答

2

是它显示的方式,但实际上值是无。 如果你试试这个

Option.isNone ((compare [Some 1] [Some 0]).[0]) ;; 

你得到

val it : bool = true 
1

其实,你compare功能给出了正确的答案。 fsi打印机打印Nonenull,这有点误导。

您可以测试None是不相容的不安全null值如下:

let xs = compare [Some 1] [Some 0] 
let ys = [None] 
let zs = [null] 
let test1 = xs = ys;; // true 
let test2 = xs = zs;; // error: The type 'int option' does not have 'null' as a proper value 

顺便说一句,你的函数有错误的缩进和难以阅读。您可以使用模式匹配来提高其可读性:

let compare (a:int option list) b =   
let r = 
    match a, b with 
    | [_; None], [_; None] -> [None] 
    | [_; None], y::_ -> [y; None] 
    | x::_, [_; None] -> [x; None] 
    | _ when a = b -> a 
    | _ -> [None] 
r