2009-12-03 43 views
2

我怎樣才能改變幾個值abc等來a'b'c'等,這樣x'=f(x)?這些值綁定到特定的名稱,並且它們的數量在編譯時已知。當我將函數應用於OCaml中的已知參數列表時,如何避免警告?

我試圖通過以下方式的功能應用到列表:

let [a';b'] = List.map f [a;b] in ... 

但它產生的警告:

Warning P: this pattern-matching is not exhaustive.                           
Here is an example of a value that is not matched:                           
[] 

任何方式來避免呢?

回答

7

你可以寫映射的一些功能上統一的元組,即:

let map4 f (x,y,z,w) = (f x, f y, f z, f w) 
let map3 f (x,y,z) = (f x, f y, f z) 
let map2 f (x,y) = (f x, f y) 

,然後每當有需要時你可以使用它們。

let (x',y') = map2 f (x,y) 
4

不幸的不是。您可以通過編寫使編譯器靜音

match List.map f [a;b] with 
    [a';b'] -> ... 
| _ -> assert false 

但這就是全部。

1

編譯器試圖在這裏幫助你。它告訴你,你正試圖分配一個未知的列表[a';b']。如果一年後你改變這個代碼,以便第一個列表[a;b]被重構到代碼中的不同位置,所以你不會看到它,並且函數f被改變,使得它有時有時返回不同的列表?然後您將有時獲得運行時異常,嘗試將[a';b']與錯誤列表匹配。編譯器無法檢查代碼是否正確,因此是警告。

爲什麼不寫

let (a', b', c') = (f a, f b, f c);; 

這不是這麼多的工作來寫這篇文章,但對未來的代碼中的任何改變完全安全的。

+0

我應該擔心的變化是如果'List.map'函數改變了,這是非常不可能的。我不想編寫'(fa,fb,fc)'的原因是我必須寫'f'三次,如果函數名比'f'長,它看起來會比寫它曾經。 – 2012-04-05 13:19:00

相關問題