Ошибка типа ocaml с типом общего списка (ide * 'a) - PullRequest
0 голосов
/ 10 января 2019

Я кодирую интерпретатор 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).

1 Ответ

0 голосов
/ 10 января 2019

Если invariant является частью взаимно рекурсивного определения функции, вам необходимо явно указать универсальное количественное выражение:

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

В вашем случае может быть проще отделить invariant от взаимно рекурсивного блока.

...