OCAML:递归列表模式匹配;打印无效匹配

时间:2019-10-28 09:26:55

标签: recursion pattern-matching ocaml

我想对列表进行模式匹配。

原因是,我有一个来自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 个答案:

答案 0 :(得分:1)

我不确定我是否在这里理解您的问题。您可以使功能compare_element_wise返回无效标志的列表吗?

签名变为:

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

然后在user_input_valid的代码中,可以使用compare_element_wise的结果打印出无效标志。

另外,请注意,有一个用于解析命令行的标准库包称为“ Arg”:https://caml.inria.fr/pub/docs/manual-ocaml/libref/Arg.html