我有一个OCaml函数,它返回表中指定单元格的值。该功能正常,但我仍然收到警告:
警告8:此模式匹配并非详尽无遗。 以下是不匹配的值的示例: ([],_)
即使我实际上在我的实现中占了这个值:
let cell_value([i;j],table) = match ([i;j],table) with
([],_) -> []
| (_,[]) -> []
| (_::_,_::_) -> List.nth (List.nth table (j-1)) (i-1);;
就像我说的,函数返回正确的值,我只是试图摆脱错误。我对OCaml还是比较新的,所以非常感谢任何帮助!
答案 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).