【问题标题】:(OCaml: non-exhaustive pattern matching(OCaml:非穷举模式匹配
【发布时间】:2018-09-18 01:18:41
【问题描述】:

我有一个 OCaml 函数,它返回表格中指定单元格的值。该功能正常工作,但我仍然收到警告说明:

警告 8:这种模式匹配并不详尽。 以下是不匹配的值的示例: ([],_)

尽管我实际上已经在我的实现中考虑了这个价值:

let cell_value([i;j],table) = match ([i;j],table) with
      ([],_)      -> []
    | (_,[])      -> []
    | (_::_,_::_) -> List.nth (List.nth table (j-1)) (i-1);;

就像我说的,函数返回正确的值,我只是想摆脱错误。我对 OCaml 还是很陌生,所以任何帮助都将不胜感激!

【问题讨论】:

  • 你的签名很奇怪。在这种应用程序中使用元组比使用列表更常见。以下会更有意义,也会更简单:let cell_value((i,j),table) = ...

标签: functional-programming pattern-matching ocaml


【解决方案1】:

与您可能认为的相反,问题不是来自match 关键字引入的模式匹配,而是来自另一个您可能不知道的关键字。实际上,您的定义的以下片段中存在模式匹配:

let cell_value ([i;j], table) = ...

因为([i; j], table) 实际上包含模式[i; j]。出于这个原因,这个定义假设作为cell_value 的参数给出的对的第一个组件是一个恰好包含两个元素的列表。换句话说,这个定义等价于:

let cell_value = function ([i; j], table) -> ...

也可以:

let cell_value x = match x with ([i; j], table) -> ...

现在,您可能了解编译器发出的警告:如果您向函数提供([], table) 形式的值,它将失败。编译器是对的:

# cell_value ([], []);;
Exception: Match_failure ("//toplevel//", 1, 14).

【讨论】:

  • 我明白了。这个警告现在确实更有意义了。但是我仍然不确定我需要做什么来清理它。我无法更改函数原型,所以我必须使用 'cell_value ([i;j], table'。还有什么提示吗?非常感谢!
  • 如果你需要一个接受两个整数的函数,为什么不使用一对而不是列表呢?
  • 我承认这可能不是我自己做的方式,但这是为了分配,所以如果我改变功能,我会失去积分。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多