类型错误 OCaml

Type-error OCaml

我实际上是一名计算机科学专业的法国学生,我正在学习一门名为“高级编程”的课程。出于本课程的目的,我需要在 OCaml 中开发游戏......blablabla......但我面临着一个我无法独自解决的问题。

正如您在下面看到的,我创建了一个名为 l_exists 的函数(我认为它是 List.exists 的扩展,具有我期望的行为)。该函数 return 符合谓词的元素列表。

问题是"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
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 应该是一个位置列表,但是您在 meme_pos 定义中手动指定了类型 objel list。所以,出现这个错误。

您很可能需要重写您的 p_pos_egale 定义。它的类型应该是 objel -> position -> bool