首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将函数应用于OCaml中的已知参数列表时,如何避免出现警告?

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

Stack Overflow用户
提问于 2009-12-03 19:26:31
回答 3查看 205关注 0票数 2

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

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

代码语言:javascript
复制
let [a';b'] = List.map f [a;b] in ...

但它会产生警告:

代码语言:javascript
复制
Warning P: this pattern-matching is not exhaustive.                                                                                                         
Here is an example of a value that is not matched:                                                                                                          
[]

有什么方法可以避免它吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-03 23:55:58

您可以编写一些函数来映射到统一的元组,例如:

代码语言:javascript
复制
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)

然后你就可以在需要的时候使用它们了。

代码语言:javascript
复制
let (x',y') = map2 f (x,y)
票数 7
EN

Stack Overflow用户

发布于 2009-12-03 19:58:42

不幸的是没有。您可以通过编写以下代码使编译器静默

代码语言:javascript
复制
match List.map f [a;b] with
  [a';b'] -> ...
| _ -> assert false

但仅此而已。

票数 4
EN

Stack Overflow用户

发布于 2012-04-05 16:57:21

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

为什么不写呢?

代码语言:javascript
复制
 let (a', b', c') = ( f a, f b, f c);;

编写这段代码并不需要太多的工作,但对于将来代码中的任何更改都是完全安全的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1839340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档