我实际上是一名计算机科学的法国学生,我正在学习一门名为高级编程的课程。为了课程的目的,我需要在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
答案 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
类型。