2015-10-18 2 views
0

У меня есть этот сегмент функции:OCaml ошибка типа по шаблону

and interpret_read (id:string) (mem:memory) 
       (inp:string list) (outp:string list) 
: bool * memory * string list * string list = 
    match inp with 
    | [] -> raise (Failure "unexpected end of input") 
    | head :: tail -> (true, (append mem (id, int_of_string head)), tail, outp) 

Тип памяти определяется следующим образом:

type memory = (string * int) list;; 

Когда я пытаюсь #use исходный код я получаю следующее сообщение об ошибке:

Error: This expression has type 'a * 'b 
but an expression was epected of type (string * int) list 

Я еще новичок в OCaml, так как я понимаю «а и» б родовые типы, и они должны быть определить d как строка и int, прежде чем они могут быть добавлены в mem. Я чувствую, что это понимание не совсем точно, потому что если бы это было, то идентификатор case уже должен быть определен как строка, а int_of_string head должен быть int. Может ли кто-нибудь помочь мне разобраться в моем замешательстве?

EDIT: Я изменил функцию к следующему:

and interpret_read (id:string) (mem:memory) 
       (inp:string list) (outp:string list) 
: bool * memory * string list * string list = 
    match inp with 
    | [] -> raise (Failure "unexpected end of input") 
    | head :: tail -> (true, mem :: (id, int_of_string head), tail, outp) 

И я получаю следующее сообщение об ошибке:

This expression has type memory = (string * int) list 
but an expression was expected of type string * int 

Это не имеет смысла для меня, потому что он должен быть памяти типа.

Если изменить функцию на следующее:

and interpret_read (id:string) (mem:memory) 
       (inp:string list) (outp:string list) 
: bool * memory * string list * string list = 
    match inp with 
    | [] -> raise (Failure "unexpected end of input") 
    | head :: tail -> (true, (id, int_of_string head), tail, outp) 

Затем я получаю следующее сообщение об ошибке:

This expression has type 'a * 'b 
but an expression was expected of type memory = (string * int) list 

Что и тип Выражение просто было! Там определенно что-то мне не хватает здесь, но я не могу понять это.

ответ

1

Вы не даете определение для append. Если я предполагаю, что это List.append, его тип 'a list -> 'a list -> 'a list. I.e., он принимает два списка и возвращает список. Но вы передаете список и один элемент (пару).

+0

Да, извините, добавлено. Как же добавить одну пару? –

+0

Я полагаю, что просто использовал бы «::»? –

+0

Я внес изменения в OP, пожалуйста, посмотрите, если у вас есть время –

Смежные вопросы