我一直在写一些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)
你不需要在du_rec中使用`和`。不知道这是否有帮助。 – gradbot 2011-01-12 17:26:08
原始代码有点不正确,并没有编译。我已经修复它,以便编译。我也在我的机器上测试过它,它似乎工作正常。你能用F#和FSI版本号来描述你正在使用的环境(单声道或许?)吗? – Juliet 2011-01-12 17:40:44