代码之家  ›  专栏  ›  技术社区  ›  HegoDamask

(OCaml:非穷举模式匹配)

  •  0
  • HegoDamask  · 技术社区  · 6 年前

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

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

    尽管我在这里的实现中已经考虑到了这一价值:

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

    正如我所说,函数返回正确的值,我只是想消除错误。我对OCaml还是相当陌生的,所以非常感谢您的帮助!

    1 回复  |  直到 6 年前
        1
  •  7
  •   Yann Régis-Gianas    6 年前

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