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



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

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,但我很难理解它,尤其是当有一个或多个断言语句时。这是我到目前为止编写的代码:

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没有什么花哨或神秘的事情。它只是一行代码,用于测试您的函数是否适用于一个特定输入。如果断言失败,则函数有错误。

最新更新