2015-06-04 43 views
0

引发错误匹配内部在OCaml中,我有一个包含城市名称的字符串列表(像“1 - 纽约; 2,伦敦; 3 - 巴黎”)。我需要让用户输入一个数字(如果他们想要伦敦,他们必须输入2)。 我想提出一个例外信息,说明这个城镇是无效的,如果这个人在例子中键入例如“4”。 我想这一点,但它不工作:OCaml的:与结构

let chosenTown = match int_of_string (input_line stdin) with | x > (length listOfTowns) -> raise (Err "Not a valid town")

什么是代码的好办法,“如果选中的数字比列表的长度是更大然后引发错误”?

+0

不工作是一个模糊的一句 – ivg

+0

有另一种方式来限制用户只能从现有的数字选择?如果列表中有3个项目,那么该人不能选择“4”? –

+0

好的,通过“不行”我的意思是我得到:“错误:语法错误” –

回答

1

模式不能包含任意表达式。它可以是一个常量,一个构造函数的名字,记录字段大括号,列表,阵列等

但模式可以把守,例如内

match int_of_string (input_line stding) with 
| x when x >= length listOfTowns -> 
invalid_arg "the number is too large" 
| x -> List.nth listOfTowns x 
+0

非常感谢!现在更清晰:) –

0

要完成答案,图案匹配依赖于统一和不期望断言(它不是一个Cswitch这样的等价物)。

的想法是,你提供不同的“形状”(模式),您的长期(你匹配的东西)可以有。 对于例如列表:

match l with 
| e :: e' :: r -> (*...*) 
| e :: r  -> (*...*) 
| []   -> (*...*) 

它也有一个结合的效果,如果你传递,比如说,[1](一个非常小的单子确实),它不会匹配e :: e' :: r,但将匹配e :: r,然后e = 1r = []


正如IVG说,你可以添加条件,布尔这个时候,由于关键字when

然而,操纵列表这样的时候,我会去一个递归函数:

let rec find_town n l = 
    match l with 
    | t :: _ when n = 1 -> t 
    | _ :: r   -> find_town (n-1) r 
    | []    -> raise (Err "Not a valid town") 

这基本上是再次书写List.nth但改变它引发异常。

+0

非常感谢! –