2011-12-18 2 views
1

У меня возникли проблемы со следующими фа диез функции:Опции FSharp И Null

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. Если вы попробуете это

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

Вы

val it : bool = true 
1

На самом деле, ваша compare функция дает правильный ответ. Принтер fsi печатает None как null, что немного вводит в заблуждение.

Вы можете проверить, что 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 

BTW, ваша функция имеет неправильные отступы и трудно читать. Вы можете улучшить его читаемость с использованием сопоставления с образцом:

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 
Смежные вопросы