F # - странное поведение при сопоставлении с образцом различаемых союзов - PullRequest
0 голосов
/ 12 января 2011

Я пишу 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)

1 Ответ

3 голосов
/ 13 января 2011

Судя по комментариям, это просто неудачный опыт в отладчике (где выделение говорит о том, что поток управления перемещается туда, где его нет);код делает то, что вы ожидаете.

(Есть ряд мест, где компилятор F # может улучшить свои точки последовательности, сгенерированные в pdbs, чтобы улучшить опыт отладки; я думаю, что мы посмотрим на этов будущем выпуске.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...