如何将断言条件应用于更改列表?

How to apply assert condition to change list?

对于此方法,我应该复制满足 assert 语句中表达的条件的列表元素。这是骨架:

let rec cond_dup l f =
  (* YOUR CODE HERE *)
   raise (Failure "Not implemented")
assert (cond_dup [3;4;5] (fun x -> x mod 2 = 1) = [3;3;4;5;5])

出于某种原因,我的代码一直失败,但我不明白为什么。我目前正在学习 OCaml,但我很难理解它,尤其是当有一个或多个 assert 语句时。这是我到目前为止编写的代码:

let rec cond_dup l f =
  (* YOUR CODE HERE *)
  match l with  
  | [] -> []
  |h::[] -> 
    if f h then h::h::[]
    else h::[]
  |h::t -> 
    if f h then h::h::(cond_dup t f)
    else (cond_dup t f)

  let f()= raise (Failure "Not implemented1")

let f() = assert (cond_dup [3;4;5] (fun x -> x mod 2 = 1) = [3;3;4;5;5])
;;

Please if you can tell me what I am doing wrong that would be great.

您的代码复制了满足谓词的元素。但它也应该保留不满足预测的元素不变。您正在删除这些元素。想想你的函数的最后一行。这就是删除(有效地)发生的地方。

(由于您的代码有效地复制了经过修改的列表,删除元素的方法就是不将其包含在副本中。这就是您正在做的。)

顺便说一句,assert 并没有什么特别或神秘的地方。它只是一行代码,用于测试您的函数是否适用于某个特定输入。如果断言失败,则说明您的函数有错误。