2011-01-12 43 views
0

我一直在写一些F#约6个月,我遇到了一些我无法解释的行为。下面有一些简单的代码。 (值的名称已被改变,以保护无辜!)F# - 模式匹配区分工会时的奇怪行为

我有一个使用记录类型rec1和rec2定义的层次结构,也是可能的值CaseA和CaseB的dicriminated联合类型。我正在调用一个采用du_rec选项类型的函数('mynewfunc')。这个函数在内部定义了一个处理层次结构的递归函数。

我开始通过传递None选项值来表示层次结构的根(实际上,这个函数是从文件中反序列化层次结构)来处理。

当我运行下面的代码时,我点击了“failwith”无效的父代“”行代码。我无法理解这是为什么,因为传递下来的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) 
+0

你不需要在du_rec中使用`和`。不知道这是否有帮助。 – gradbot 2011-01-12 17:26:08

+3

原始代码有点不正确,并没有编译。我已经修复它,以便编译。我也在我的机器上测试过它,它似乎工作正常。你能用F#和FSI版本号来描述你正在使用的环境(单声道或许?)吗? – Juliet 2011-01-12 17:40:44

回答

3

根据评论,这在调试器中是一个不好的体验(突出显示控制流程正在进行的地方)。该代码符合你的期望。

(有许多的地方,F#编译器可以改善其序列点生成到PDBS,改善调试体验。我想我们会在以后的版本中看着这)