2015-04-12 2 views
0

Я на самом деле французский студент по информатике, и я следую курсу под названием «Расширенное программирование». Для цели курса мне нужно разработать игру в OCaml ... blablabla ... Но я столкнулся с проблемой, которую я не могу разобраться в одиночку.Тип ошибки OCaml

Как вы можете видеть ниже, я создал функцию l_exists (которую я считаю расширением List.exists с поведением, которое я ожидаю). Эта функция возвращает список элементов, которые согласуются с предикатом.

Проблема «meme_pos». У меня была ошибка типа, но я не понимаю, почему, поскольку тип objet также является типом позиции. Итак, если кто-то может показать мне, что случилось, и как этого избежать. Я буду очень доволен.

Кстати, извините за мой английский. Я сделал все возможное:/

type position = { i : int; j : int } 

type objet = 
    | Robot of position 
    | Debris of position 

let l_exists p li arg_s = 
    let rec aux l acc = match l with 
    |[] -> acc 
    |x::xs -> aux xs (if(p arg_s x) then x::acc else acc) 
    in aux li [] 

val l_exists : ('a -> 'b -> bool) -> 'b list -> 'a -> 'b list = <fun> 

let meme_pos pos (objetl:objet list) = 
    let p_pos_egale (pos1:position) (pos2:position) = 
    if(pos1=pos2) then true else false 
    in l_exists p_pos_egale objetl pos 

Error: This expression has type objet list but an expression was expected of type position list. 
Type objet is not compatible with type position. 
Expression : in l_exists p_pos_egale objetl pos 

ответ

0
val l_exists : ('a -> 'b -> bool) -> 'b list -> 'a -> 'b list = <fun 

Вы объявляете p_pos_egale:

let p_pos_egale (pos1:position) (pos2:position) = pos1=pos2 

и после того, что вы пишете

l_exists p_pos_egale objetl pos 

Давайте применим l_exists к p_pos_egale:

# l_exists p_pos_egale;; 
- : position list -> position -> position list = <fun> 

Если вы заменяете ваш p_pos_egale к l_exists вы увидите, что 'a становится таким же, как 'b, т.е. position. OCaml решает, что objetl должен быть списком позиций, но вы указали тип objel list вручную в определении meme_pos. Итак, эта ошибка появляется.

Скорее всего, вам нужно переписать определение p_pos_egale. Он должен иметь тип objel -> position -> bool.

+0

Благодарим вас так mutch! –

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