如何将几个值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:
[]有什么方法可以避免它吗?
发布于 2009-12-03 23:55:58
您可以编写一些函数来映射到统一的元组,例如:
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)发布于 2009-12-03 19:58:42
不幸的是没有。您可以通过编写以下代码使编译器静默
match List.map f [a;b] with
[a';b'] -> ...
| _ -> assert false但仅此而已。
发布于 2012-04-05 16:57:21
编译器正试图在这里帮助您。它会告诉您,您正尝试将一个未知列表分配给[a';b']。如果一年后您更改了这段代码,以便将第一个列表[a;b]重构到代码中的另一个位置,使您看不到它,并且更改了函数f,使其有时返回一个不同的列表,该怎么办?在尝试将[a';b']与错误的列表进行匹配时,有时会出现运行时异常。编译器无法检查代码是否正确,因此出现警告。
为什么不写呢?
let (a', b', c') = ( f a, f b, f c);;编写这段代码并不需要太多的工作,但对于将来代码中的任何更改都是完全安全的。
https://stackoverflow.com/questions/1839340
复制相似问题