【问题标题】:Match "*" in OCaml在 OCaml 中匹配“*”
【发布时间】:2015-11-02 01:15:22
【问题描述】:

在我的 OCaml 程序中,我有以下内容:

let rec string_of_list p "" = match p with  
[] -> "[]"
|s::rest -> String.concat " " [Bytes.to_string s; string_of_list rest ""]

这段代码嵌套在更多代码中,但是当我编译它时,我得到了错误:

Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
"*"

星星是指 Kleene 围场吗?我尝试通过附加以下匹配来解决问题:

| _ -> "ERROR"

但我仍然得到同样的错误。有人可以帮帮我吗?

【问题讨论】:

    标签: pattern-matching ocaml


    【解决方案1】:

    编译器告诉您,您编写为"" 的参数与调用者可以传递给函数的所有可能字符串都不匹配。也就是说,它并不详尽。

    为了获得额外帮助,编译器会选择一个不匹配的字符串来说明问题。它选择字符串"*"有点奇怪,但这确实是一个不匹配的字符串。

    这是一个非常简单的会话,完全显示了相同的问题:

            OCaml version 4.02.1
    
    # let f "" = 44;;
    Warning 8: this pattern-matching is not exhaustive.
    Here is an example of a value that is not matched:
    "*"
    val f : string -> int = <fun>
    # 
    

    确实,如果您将"*" 传递给f,它将失败(因为它的参数是由非详尽模式指定的):

    #  f "*";;
    Exception: Match_failure ("//toplevel//", 1, 6).
    

    这就是编译器告诉你的。有一些参数会导致此异常。 (实际上除了空字符串以外的所有参数都会导致异常)。

    我不知道为什么编译器会在所有可能的字符串中选择"*" 来提及。

    (注意OCaml中的函数参数由patterns指定,""是匹配空字符串的有效模式。所以这里的函数f是一个完全有效的函数,返回44 当传递空字符串并为每个其他字符串引发异常。)

    【讨论】:

      【解决方案2】:

      没关系,问题出在函数定义上:

      let rec string_of_list p "" = match p with 
      

      引号不应该在那里。不过我还是很好奇 * 代表什么。

      【讨论】:

        【解决方案3】:

        您正在隐式匹配一个已弃用的字符串。

        有关详细信息,请参阅以下两个问题

        1. https://github.com/ocaml/ocaml/pull/250
        2. https://github.com/ocaml/ocaml-manual/pull/13

        【讨论】:

          猜你喜欢
          • 2013-08-27
          • 1970-01-01
          • 1970-01-01
          • 2019-02-16
          • 1970-01-01
          • 2019-03-27
          • 1970-01-01
          • 2015-05-28
          • 1970-01-01
          相关资源
          最近更新 更多