(OCaml:非穷举模式匹配

0 ocaml functional-programming pattern-matching

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

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

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

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

就像我说的,函数返回正确的值,我只是想摆脱错误.我仍然是OCaml的新手,所以任何帮助将不胜感激!

小智 7

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

let cell_value ([i;j], table) = ...
Run Code Online (Sandbox Code Playgroud)

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

let cell_value = function ([i; j], table) -> ...
Run Code Online (Sandbox Code Playgroud)

或者也是:

let cell_value x = match x with ([i; j], table) -> ...
Run Code Online (Sandbox Code Playgroud)

现在,您可能理解编译器发出的警告:如果您为([], table)函数提供了表单的值,它将失败.编译器是对的:

# cell_value ([], []);;
Exception: Match_failure ("//toplevel//", 1, 14).
Run Code Online (Sandbox Code Playgroud)