我正在编码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)。
答案 0 :(得分:0)
如果invariant
是相互递归函数定义的一部分,则需要使用通用量化来明确指出:
and invariant: 'a. (ide * 'a) list -> bool = fun l -> ...
在您的情况下,将invariant
与相互递归的代码块分开可能更简单。