Соответствие списка в OCaml - PullRequest
       13

Соответствие списка в OCaml

0 голосов
/ 12 сентября 2018

У меня есть функция, над которой я работаю в 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

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 12 сентября 2018

Один из способов взглянуть на это так: contains_str слишком слаб, чтобы делать то, что вы хотите. Вы хотите знать , сколько раз появляется строка, а не только, появляется она или нет. Вы могли бы рассмотреть функцию, которая возвращает список появлений строки a в списке строк b (пусто, если нет появлений).

Кроме того, вот еще один случай, когда ваш текущий код не обрабатывается должным образом:

# in_both ["a"; "b"] ["b"; "a"];;
- : string list = ["a"]

Мне кажется, что нет причин переходить к концу второго списка (tl2) только потому, что в нем найден hd1. Возможно, глава второго списка появится позже в первом списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...