当我将函数应用于OCaml中的已知参数列表时,如何避免警告?

时间:2009-12-03 11:26:31

标签: ocaml

如何将多个值abc等转换为a'b'c'等,以便x'=f(x)?这些值绑定到特定名称,并且它们的数量在编译时是已知的。

我尝试按以下方式将函数应用于列表:

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:                                                                                                          
[]

有什么方法可以避免吗?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:4)

不幸的是没有。您可以通过编写

来使编译器静音
match List.map f [a;b] with
  [a';b'] -> ...
| _ -> assert false

但就是这样。

答案 2 :(得分:1)

编译器正试图在这里帮助你。它告诉您,您正在尝试将未知列表分配给[a';b']。如果一年之后您更改此代码,以便将第一个列表[a;b]重构为代码中的其他位置,以便您不会看到它,并且函数f已更改,以便它有时会返回不同的列表吗?然后,您将有时获取运行时异常,尝试将[a';b']与错误列表匹配。编译器无法检查代码是否正确,因此警告。

为什么不写

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

编写此代码并不是更多的工作,但完全可以防止代码中的任何未来更改。