2015-06-04 42 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

非常感謝! –