2016-04-11 15 views
0

ast.mlにおいて、構造は以下である:それは異なるパターンマッチがprint_fieldsrecに前記しかしOCamlのパターンマッチが

let rec print_bean fmt = function 
    | Bool -> put fmt "%s" "bool" 
    | Int -> put fmt "%s" "int" 
    | TLr f -> put fmt "%s" "{"; print_fieldsrec fmt f ; put fmt "%s" "}" 
    | TId id -> put fmt "%s" id 
and print_fieldsrec fmt = function 
    | f :: fe -> print_field fmt f; put fmt "%s" "," ; print_fieldsrec fmt fe 
and print_field fmt = function 
    | FIe (id, beantype) -> put fmt "%s" id; put fmt "%s" ":"; print_bean fmt beantype 

printer.mlで
type beantype = 
    | Bool 
    | Int 
    | TLr of fieldsrec 
    | TId of ident 
and fieldsrec = { fields : field list } 
and field = 
    | FIe of (ident * beantype) 

、iは下記のように使用します

Error: This pattern matches values of type 'a list 
    but a pattern was expected which matches values of type 
    Bean_ast.fieldsrec 

私はどのようにprinter.mlを変更できますか?

+2

'TLr'はリストではなく' fieldsrec'を保持します。たぶん、パターンを '| TLr {fields = f} 'である。 – RichN

+0

私はあなたが正しいと試してみました –

答えて

0

タイプfieldsrec = { fields : field list }で混乱しているようです。あなたは代わりに| Fields of field listを使用するというJeffreyのアドバイスに従っていたはずです。

fieldsrecがリストではありません、それはそう

print_fieldsrec fmt = function f :: fe -> ... 

は、その名のタイプを持っていない、リストを含むレコードです。

また、再帰的なprint_fieldsrecの基本ケースを忘れてしまった。