(OCaml:非穷举模式匹配

时间:2018-04-08 15:20:44

标签: functional-programming pattern-matching ocaml

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

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

即使我实际上在我的实现中占了这个值:

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

就像我说的,函数返回正确的值,我只是试图摆脱错误。我对OCaml还是比较新的,所以非常感谢任何帮助!

1 个答案:

答案 0 :(得分:7)

与您可能认为的相反,问题不是来自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).