Я пишу F # уже около 6 месяцев, и я столкнулся с поведением, которое не могу объяснить. У меня есть немного кода ниже. (имена значений были изменены, чтобы защитить невинных!)
У меня есть иерархия, определенная с использованием типов записей rec1 и rec2, а также разнородный тип объединения с возможными значениями CaseA и CaseB. Я вызываю функцию ('mynewfunc'), которая принимает тип опции du_rec. Внутренне эта функция определяет рекурсивную функцию, которая обрабатывает иерархию.
Я начинаю обработку, передавая значение опции None для представления корня иерархии (в действительности эта функция десериализует иерархию из файла).
Когда я запускаю приведенный ниже код, я нажимаю на строку кода «failwith« invalid parent »». Я не могу понять, почему это так, потому что значение None, которое передается внизу, должно соответствовать внешнему регистру None.
Код работает, если я удаляю любой из наборов комментариев. Для меня это не шоу-стоппер - я просто чувствую себя немного неловко, не зная, почему это происходит (я думал, что понимаю f #)
Заранее спасибо за любые ответы
Джеймс
type rec2 =
{
name : string
child : rec1 option
}
and rec1 =
{
name : string ;
child : rec2 option
}
and du_rec =
| Case1 of rec1
| Case2 of rec2
let mynewfunc (arg:du_rec option) =
let rec funca (parent:du_rec option) =
match parent with
| Some(node) ->
match node with
| Case2(nd) ->
printfn "hello"
(* | Case1(nd) ->
printfn "bye bye" *)
| _ ->
failwith "invalid parent"
| None ->
// printfn "case3"
()
funcb( None )
and funcb (parent: du_rec option) =
printfn "this made no difference"
let node = funca(arg)
()
let rootAnnot = mynewfunc(None)