Я кодирую интерпретатор 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) list
Тип evT не совместим с типом exp
В инвариате «Dict» используйте список (ide * exp), находясь в «AddPair».
инвариант получит evalnewpair @ oldpairs, где evalnewpair имеет тип (ide * evT) и oldpairs (ide * evT).