如何将多个值a
,b
,c
等转换为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:
[]
有什么方法可以避免吗?
答案 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);;
编写此代码并不是更多的工作,但完全可以防止代码中的任何未来更改。