Как применить условие assert для изменения списка? - PullRequest
0 голосов
/ 16 февраля 2020

Для этого метода я должен дублировать элементы списка, которые удовлетворяют условию, выраженному в операторе 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.

1 Ответ

1 голос
/ 16 февраля 2020

Ваш код дублирует элементы, которые удовлетворяют предикату. Но также предполагается оставить неизменными элементы, которые не удовлетворяют предикату. Вместо этого вы удаляете эти элементы. Подумайте о последней строке вашей функции. Вот где удаление (эффективно) происходит.

(Поскольку ваш код эффективно копирует список с изменениями, способ удалить элемент - просто не включать его в копию. Это то, что вы делаете .)

В качестве дополнительного комментария нет ничего необычного или таинственного, что происходит с assert. Это всего лишь строка кода, которая проверяет, работает ли ваша функция для одного конкретного ввода. В случае сбоя подтверждения ваша функция выдает ошибку.

...