2015-11-02 61 views
0

在我的OCaml程序,我有以下几点:匹配“*” 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" 

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

回答

4

编译器告诉你,你写的""的参数不匹配调用者传递给函数的每个可能的字符串。也就是说,这并不完全。

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

这里显示了同样的问题一个非常简单的会话准确:

 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一个完全有效的功能每个其他字符串都有一个例外。)

+0

谢谢!非常丰富 – Abundance

0

没关系,问题是用函数的定义:

let rec string_of_list p "" = match p with 

引号是不应该在那里。尽管如此,我仍然很好奇。