2013-03-09 81 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