2011-12-18 1 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

答えて

2

実際の表示方法ですが、値はNoneです。 あなたはあなたが

val it : bool = true 
1

を取得し、この

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

をしようとすると、実際にあなたの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 
関連する問題