2010-04-29 85 views
4

有沒有辦法讓模式匹配匹配我的值與任何負數?無論負數是什麼,我只需要匹配任何負數就沒有關係。OCaml:匹配任何負數

我已經完成了我想用這個簡單的代碼是什麼:

let y = if(n < 0) then 0 else n in 
match y with 
0 -> [] 
| _ -> [x] @ clone x (n - 1) 

但我想消除if聲明,只是得到它來檢查它作爲其他情況下,在match聲明

回答

9

是,使用保護:

match n with 
    _ when n < 0 -> [] 
    | _ -> [x] @ clone x (n - 1) 
+0

哦,我明白了,我將不得不對衛兵做一些研究。謝謝! – nicotine 2010-04-29 21:47:26

0

有關鍵字時。由頭(我現在不能測試)

讓y =與n匹配 |當n < 0 - > 0 | 0 - > [] | _ - > [x] @ clone x(n - 1)

然而,即使你的例子不應該工作。一方面你返回一個int,另一方面是一個列表。

+0

沒有,在比賽中兩個路徑清單。 '@'操作符的類型是''列表 - >'列表 - >'列表'。 – Chuck 2010-04-29 21:44:41

+0

我認爲你誤解了我的代碼,if語句只是一個額外的代碼行,用於設置匹配語句的值,當n小於0時。它只是應該做與0一樣的事情,並返回空的清單。 – nicotine 2010-04-29 21:52:44

+0

哦的確如此!對於我昨天回答這個問題來說太遲了...... 我的不好:/ – 2010-04-30 13:01:20

8

你可以讓你的代碼乾淨了一點這樣的:

match n < 0 with 
| true -> [] 
| false -> [x] @ clone x (n - 1) 

更妙的是:

if n < 0 then [] else [x] @ clone x (n - 1) 

一般來說,如果語句比簡單邏輯測試的匹配更清晰。

雖然我們在這,我們不妨使用::代替@

if n < 0 then [] else x :: clone x (n - 1) 
+0

雖然我們正在做所有這些,但我們還引入了一個錯誤,其中'n = 0'映射到'0 :: clone x(-1)'而不是'[]'。試圖回答這個問題通常會更好,正如在查克的回答中一樣,爲了避免這種情況,以及在真實情況更復雜的情況下。 – 2013-06-25 13:42:13