2015-11-02 59 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 

引號是不應該在那裏。儘管如此,我仍然很好奇。