OCAML: рекурсивное сопоставление с образцом списка;Распечатать неверное совпадение - PullRequest
0 голосов
/ 28 октября 2019

Я хотел бы сделать сопоставление с шаблоном списка.

Причина в том, что у меня есть список флагов из переменной Sys.argv, и я хотел бы проверить, все ли флагидействительный.

Список Sys.argv также содержит исполняемый файл и путь в качестве первых двух элементов, которые я игнорирую

У меня есть следующие функции:

let rec compare_element_wise (user_input : string list) (valid_flags: string list) : bool =
  match user_input with
  | [] -> true
  | head::tail -> (List.mem head valid_flags) && (compare_element_wise tail valid_flags)
   (*Here print invalid flag if detected*)


let user_input_valid : bool =
  let valid_flags = ["-config"; "-module-versions"; "-json"; "-no-logging"; "-out"; "-partial"] in
  let user_input = Array.to_list Sys.argv in

  if List.length user_input > 2 then
    compare_element_wise get_user_flags valid_flags
  else true

compare_element_wise возвращает один логическийкоторый указывает, что все флаги действительны, но я также хотел бы распечатать недопустимые флаги, чтобы пользователь знал, что пошло не так. (Get_user_flags - это функция, которая возвращает список с флагами)

Я пытался поместить оператор if else в соответствующую функцию, но, поскольку он рекурсивный, он также выведет все предыдущие флаги в недопустимый флаг.

1 Ответ

1 голос
/ 28 октября 2019

Я не уверен, что понимаю вашу проблему здесь. Можете ли вы заставить функцию compare_element_wise возвращать список недопустимых флагов?

Подпись становится:

val compare_element_wise: string list -> string list -> string list

В коде user_input_valid вы можете затем использовать результат сравнения_element_wise, чтобы распечататьнедопустимые флаги.

Также обратите внимание, что существует стандартный пакет библиотеки для разбора командной строки под названием «Arg»: https://caml.inria.fr/pub/docs/manual-ocaml/libref/Arg.html

...