У меня есть функция, над которой я работаю в Ocaml.Он состоит из функции, которая принимает два списка строк и возвращает список строк.Функция работает следующим образом.Он просматривает каждую отдельную строку в первом списке и, если находит соответствующее совпадение во втором списке, возвращает это совпадение.Если во втором списке есть повторяющееся совпадение, совпадение будет возвращено дважды.Вот тестовые примеры, которые я написал, которые описывают ожидаемое поведение:
let test () : bool =
(in_both [] ["Pearl"; "Steven"]) = []
;; run_test "in_both empty name list 1" test
let test () : bool =
(in_both ["Pearl"; "Steven"] []) = []
;; run_test "in_both empty name list 2" test
let test () : bool =
(in_both ["Pearl"; "Amethyst"; "Henry"] ["Pearl"; "Steven"]) = ["Pearl"]
;; run_test "in_both one repeat in both lists" test
let test () : bool =
(in_both ["Pearl"; "Amethyst"; "Gary"; "Blair"] ["Pearl"; "Amethyst"; "Blair"])
= ["Pearl";"Amethyst";"Blair"]
;; run_test "in_both three different repeats in both lists" test
let test () : bool =
(in_both ["Garnet"; "Amethyst"; "Pearl"] ["Pearl"; "Pearl"])
= ["Pearl";"Pearl"]
;; run_test "in_both two repeat in second list" test
Вот моя реализация функции:
let rec in_both (names1: string list) (names2: string list) : string list =
begin match (names1, names2) with
|([],[])-> []
|([],hd2::tl2)-> []
|(hd1::tl1,[])-> []
|(hd1::tl1,hd2::tl2)->if contains_str names2 hd1 = true then hd1::in_both tl1
tl2 else in_both tl1 names2
end
Все мои тесты проходят, кроме последнего теста, где онпохоже, "Pearl"
не распечатывает дважды, когда это необходимо.Что я могу делать неправильно в моей реализации?Для справки, вот определение функции для функции contains_str, которое я вызвал в in_both:
let rec contains_str (l: string list) (name: string) : bool =
begin match l with
|[]-> false
|hd::tl-> hd = name || contains_str tl name
end
Любая помощь приветствуется!