2017-10-05 10 views
0

je le type de données suivantes (s'il vous plaît ne pas tenir compte du fait que cela pourrait être beaucoup plus simples)Comment modéliser les enregistrements de correspondance dans OCaml?

type tKey = Key of int;; 

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

J'ai l'erreur suivante avec cette fonction qui ressemble à mon pattern matching est pas juste

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 

erreur fait référence à la parenthèse suivante: (ref {key; (...)})

+0

vous devriez probablement diviser votre expression de match à deux, de sorte que le premier ne traite que le wih 'null' et les balises 'Pos', et la seconde fonctionne sur la valeur * référencée * dans le cas' Pos', plutôt que de faire correspondre la totalité de 'ref'. – didierc

Répondre

4

Pour correspondre à une référence, vous ne pouvez pas utiliser ref. ref n'est pas un constructeur, c'est juste une fonction qui fait référence. Pour correspondre à une référence, vous pouvez utiliser { contents = ... }

Malheureusement cela va rendre le code encore plus dense :-)

3

Je pense que le problème est que vous essayez de correspondance de motif avec ref, ce qui est vraiment juste de sucre pour un enregistrement contenant un champ mutable contents ».

Essayez de remplacer

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

avec

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