带有通用列表类型(ide *'a)的ocaml类型错误

时间:2019-01-10 11:21:05

标签: expression ocaml typeerror interpreter

我正在编码OCaml解释器,并且我将检查配对列表中是否存在重复项。

type exp = ... | Dict of (ide * exp) list | AddPair of exp * (ide * exp) list;;
type evT = ... | DictVal of (ide * evT) list


Dict(pairs) -> 
             if invariant pairs then DictVal(evalDictList pairs r) 
             else failwith("The Dictionary has multiple copy of the same key")|

AddPair(dict, newpair) ->
             (match (eval dict r) with
                DictVal (oldpairs) -> let evalnewpair = evalDictList newpair r in
                                                if invariant (evalnewpair@oldpairs) then DictVal(oldpairs@evalnewpair)
                                                else failwith ("A new key has the same value as another already inserted")|
                            _ -> failwith ("not a dictionary"))|

and evalDictList (pairs : (ide * exp) list) (r : evT env) : (ide * evT) list = match pairs with
                [ ] -> [ ] |
                (key,value) :: other -> (key, eval value r) :: evalDictList other r;;

和不变式:

and invariant (pairs : (ide * 'a) list) : bool = match pairs with
        [ ] -> true |
        (key,value) :: other -> if lookfor key other then invariant other else false

错误: 此表达式具有类型(ide * evT)列表        但是期望使用类型(ide * exp)列表的表达式        evT类型与exp类型不兼容

在“ Dict”不变式中,在“ AddPair”中使用列表(ide * exp)  不变将得到evalnewpair @ oldpairs,其中evalnewpair具有类型(ide * evT)和oldpairs(ide * evT)。

1 个答案:

答案 0 :(得分:0)

如果invariant是相互递归函数定义的一部分,则需要使用通用量化来明确指出:

and invariant: 'a.  (ide * 'a) list -> bool = fun l -> ...

在您的情况下,将invariant与相互递归的代码块分开可能更简单。