在我的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:
"*"这颗星指的是克莱恩的外壳吗?我试图通过附加以下匹配来解决这个问题:
| _ -> "ERROR"但我还是犯了同样的错误。有人能帮我吗?
发布于 2015-11-02 01:46:49
编译器告诉您,作为""编写的参数并不匹配调用方可以传递给函数的每个可能的字符串。也就是说,它不是详尽无遗的。
为了获得额外的帮助,编译器选择一个不匹配的字符串来说明这个问题。它选择字符串"*"有点奇怪,但它确实是一个不匹配的字符串。
这里有一个非常简单的会话,显示了同样的问题:
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中的函数参数是由模式指定的,""是一个与空字符串匹配的有效模式。因此,这里的函数f是一个完全有效的函数,它在传递空字符串时返回44,并为其他字符串引发异常。)
发布于 2015-11-02 01:40:20
没关系,问题在于函数定义:
let rec string_of_list p "" = match p with 引号不应该在那里。尽管如此,我仍然对*的象征很好奇。
发布于 2015-11-02 18:07:28
您正在隐式地匹配一个不推荐的字符串。
有关更多信息,请参阅以下两个问题
https://stackoverflow.com/questions/33469269
复制相似问题