2009-12-03 41 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

相关问题