【问题标题】:Pattern matching in OCamlOCaml 中的模式匹配
【发布时间】:2013-03-09 12:15:33
【问题描述】:

我有一个 (string*int) list 类型的 OCaml 列表。 我必须遍历列表并检查 int 值。如果对于我列表中的所有元素,属性int>=0 成立,那么列表是“好的”,否则,如果它在任何一个实例中失败,那么我必须返回“失败”。 为此,我做了以下尝试

let rec check tlist = match tlist with
[] -> print_string "finished"
|(s,i)::tail -> if i < 0 then print_string "fail" else check tail 

在从解释器运行它时,我收到一条警告,指出模式匹配并不详尽。 另外,当我在以下输入类型中运行它时

let z = [("ask",1);("tell",2);("three",3);("goal",-4)] ;;

它按预期返回失败,但对于

let z = [("ask",1);("tell",2);("three",3);("goal",4)] ;; ,

它返回异常:

Match_failure ("//toplevel//", 7, -22).

如何解决这个问题?

编辑:此外,问题还有另一部分。我必须确保字符串s 在列表中不重复。该怎么办?

【问题讨论】:

  • 你确定它会引发异常吗?对我来说没有
  • 请使用触发异常的 OCaml 会话记录更新您的问题。

标签: pattern-matching ocaml


【解决方案1】:

您发布的代码很好,不会产生任何警告,并且适用于您所说的输入。

如果你想改进它,你应该尝试将算法逻辑和输入/输出分开以获得更灵活的东西:让你的函数返回一个布尔值而不是unit

【讨论】: