2016-02-20 115 views
2

因此,我正在寫一個簡單的方法,總結列表中的前3個或更少的整數 ,但我對匹配模式感到困惑。
我現在有OCaml列表匹配模式

let sums l = match l with 
    | [] -> 0 
    | (h1::h2::h3::_) -> h1+h2+h3 
    | [h1;h2;h3] -> h1+h2+h3 
    | [h1;h2] -> h1+h2 
    | [h1] -> h1 

這是否覆蓋所有的案件? 還有3個或更多的元素,我不能寫[h1; h2; h3; _]之類的東西?
對不起,如果這些問題看起來太簡單了,我剛開始學習OCaml,而我無法在網上找到這樣的東西。

+1

如果Ocaml認爲這些模式不能涵蓋所有情況,Ocaml會給你一個非常明確的警告。 –

回答

2

這是否涵蓋所有情況?

是,它們覆蓋所有的情況,但我會寫:

let sums l = match l with 
    | [] -> 0 
    | [h1] -> h1  
    | [h1; h2] -> h1+h2 
    | h1 :: h2 :: h3 :: _ -> h1+h2+h3 

[h1; h2; h3]是多餘的,因爲h1 :: h2 :: h3 :: _匹配它(使用通配符是[]

還怎麼來的3個或更多元素我不能寫[h1; h2; h3; _]之類的東西?

好吧,你就是不行。此語法無效。
編輯:對不起,我發瘋了。這個語法是有效的,但它匹配了一個沒有綁定最後一個元素的四個元素列表,這不是你想要的。

+0

謝謝,所以總是最好先匹配少數元素的案例? – Oxtis

+0

沒有。在這種情況下,不同的訂單產生相同的代碼。 – objmagic

+0

從技術上講,語法'[h1; H2; H3; _]'是有效的,它只是匹配四個元素的列表,而不是@Oxtis想要的。 – antron