为什么OCaml模式"零 - >零"似乎与所有东西相匹配?

ner*_*kez 5 ocaml pattern-matching

这是我书中的代码片段,我不确定匹配是如何工作的,因为它似乎第一种情况与所有东西相匹配.以下是Ocaml向我发出的警告:

# let zero = 0;;
# let one = 1;;
# let rec fib i =
match i with
zero -> zero
| one -> one
| j -> fib (j - 2) + fib (j - 1);;
Characters 57-60:


Warning: this match case is unused.
Characters 74-75:
Warning: this match case is unused.
| one -> one
^^^
| j -> fib (j - 2) + fib (j - 1);; 
^
val fib : int -> int = <fun>
# fib 1;;
- : int = 1
# fib 2002;;
- : int = 2002
Run Code Online (Sandbox Code Playgroud)

Jef*_*eld 9

这是一个相当常见的混乱来源.从本质上讲,您希望将模式视为由常量(如01)和由模式绑定的标识符构建.

当标识符以模式显示时,它会匹配任何内容,并将匹配的值绑定到标识符.模式中的标识符引用与标识符相关联的任何先前值.所以,实际上,您的模式将始终与第一个案例匹配并绑定zero到值i.

您可以想象您希望能够为常量值指定名称,然后使用名称而不是模式中的常量.然而,OCaml(像其他FP语言一样)不会那样工作.一个优点(在我看来)是它保持简单.

  • 您可以使用`when`为匹配添加额外的测试,但它不会改变模式的含义.它只是应用了一个额外的测试.如果你的模式只是一个标识符,这只是编写`if`语句的另一种方式.(`if`语句没有错,那就是你可能用来测试命名常量的东西.) (2认同)