类型错误OCaml

时间:2015-04-12 14:05:50

标签: types ocaml

我实际上是一名计算机科学的法国学生,我正在学习一门名为高级编程的课程。为了课程的目的,我需要在OCaml开发一个游戏... blablabla ...但是我面临着一个我无法独自思考的问题。

如下所示,我创建了一个名为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

1 个答案:

答案 0 :(得分: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类型。