首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配OCaml中的"*“

匹配OCaml中的"*“
EN

Stack Overflow用户
提问于 2015-11-02 01:15:22
回答 3查看 390关注 0票数 0

在我的OCaml程序中,我有以下内容:

代码语言:javascript
复制
let rec string_of_list p "" = match p with  
[] -> "[]"
|s::rest -> String.concat " " [Bytes.to_string s; string_of_list rest ""]

这段代码嵌套在更多的代码中,但是当我编译它时,我会得到以下错误:

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

这颗星指的是克莱恩的外壳吗?我试图通过附加以下匹配来解决这个问题:

代码语言:javascript
复制
| _ -> "ERROR"

但我还是犯了同样的错误。有人能帮我吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-11-02 01:46:49

编译器告诉您,作为""编写的参数并不匹配调用方可以传递给函数的每个可能的字符串。也就是说,它不是详尽无遗的。

为了获得额外的帮助,编译器选择一个不匹配的字符串来说明这个问题。它选择字符串"*"有点奇怪,但它确实是一个不匹配的字符串。

这里有一个非常简单的会话,显示了同样的问题:

代码语言:javascript
复制
        OCaml version 4.02.1

# let f "" = 44;;
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
"*"
val f : string -> int = <fun>
# 

实际上,如果将"*"传递给f,它将失败(因为它的参数是由非详尽的模式指定的):

代码语言:javascript
复制
#  f "*";;
Exception: Match_failure ("//toplevel//", 1, 6).

编译器就是这么告诉你的。有一些参数将导致此异常。(实际上,除空字符串之外的所有参数都会导致异常)。

我不知道为什么编译器选择所有可能要提到的字符串的"*"

(注意,OCaml中的函数参数是由模式指定的,""是一个与空字符串匹配的有效模式。因此,这里的函数f是一个完全有效的函数,它在传递空字符串时返回44,并为其他字符串引发异常。)

票数 4
EN

Stack Overflow用户

发布于 2015-11-02 01:40:20

没关系,问题在于函数定义:

代码语言:javascript
复制
let rec string_of_list p "" = match p with 

引号不应该在那里。尽管如此,我仍然对*的象征很好奇。

票数 0
EN

Stack Overflow用户

发布于 2015-11-02 18:07:28

您正在隐式地匹配一个不推荐的字符串。

有关更多信息,请参阅以下两个问题

  1. https://github.com/ocaml/ocaml/pull/250
  2. https://github.com/ocaml/ocaml-manual/pull/13
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33469269

复制
相关文章

相似问题

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