2013-03-09 80 views
-1

我有一個類型爲(string*int) list的OCaml列表。 我必須遍歷列表並檢查值int。如果對於我列表中的所有元素,屬性int>=0成立,那麼列表是「很好」,否則,如果在任何一個實例中失敗,那麼我必須返回「失敗」。 對於這一點,我做了以下嘗試OCaml中的模式匹配

let rec check tlist = match tlist with 
[] -> print_string "finished" 
|(s,i)::tail -> if i < 0 then print_string "fail" else check tail 

從解釋運行此,我收到一條警告,模式匹配並不詳盡。 此外,當我在下面的輸入類型

let z = [("ask",1);("tell",2);("three",3);("goal",-4)] ;; 

運行它,它返回預期失敗,但對於

let z = [("ask",1);("tell",2);("three",3);("goal",4)] ;; , 

返回例外:

Match_failure ("//toplevel//", 7, -22). 

如何去這個問題?

編輯:此外,還有另一部分的問題。我必須確保字符串s不在列表中重複。如何去做呢?

+0

你確定會引發異常嗎?對我來說它不是 – Kakadu 2013-03-09 12:22:02

+0

它對我來說確實! – alpha42 2013-03-09 13:27:03

+0

請更新您的問題與觸發異常的OCaml會話的抄本。 – didierc 2013-03-09 17:26:50

回答

2

你發佈的代碼很好,不會產生任何警告,併爲你說的輸入工作。

如果您想改進它,您應該嘗試將算法邏輯和輸入/輸出分開以使其更加靈活:讓您的函數返回布爾值而不是unit