如何在OCaml中模式匹配记录?

时间:2017-10-05 00:57:03

标签: pattern-matching ocaml record

我有以下数据类型(请忽略这可能更简单的事实)

type tKey = Key of int;;

type tBST = Null | Pos of node ref
        and node = {mutable key : tKey; 
            mutable left : tBST; 
            mutable right : tBST};;

这个函数出现以下错误,看起来我的模式匹配不正确

let rec string_of_tree = function
    Null -> "()"
    | Pos (ref {key; left = Null; right = Null}) -> Printf.sprintf "(%s)" (string_of_root (root tree))
    | Pos (ref {key; left; right}) -> Printf.sprintf "(%s %s %s)" 
                            (string_of_root (root tree)) 
                            (string_of_tree (leftLeaf tree)) 
                            (string_of_tree (rightLeaf tree));;

Error: Syntax error: ')' expected
Error: This '(' might be unmatched

错误引用以下括号:(ref {key;(...)})

2 个答案:

答案 0 :(得分:4)

要与参考匹配,您无法使用refref不是构造函数,它实际上只是一个引用的函数。要与参考文献匹配,您可以使用{ contents = ... }

不幸的是,这将使代码更加密集: - )

答案 1 :(得分:3)

我认为问题在于您尝试使用ref进行模式匹配,这对于包含可变contents字段的记录来说实际上只是糖。

尝试替换

| Pos (ref { ... }) -> ...

| Pos { contents = { ... }} -> ...