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)
这是一个相当常见的混乱来源.从本质上讲,您希望将模式视为由常量(如0和1)和由模式绑定的标识符构建.
当标识符以模式显示时,它会匹配任何内容,并将匹配的值绑定到标识符.模式中的标识符不引用与标识符相关联的任何先前值.所以,实际上,您的模式将始终与第一个案例匹配并绑定zero到值i.
您可以想象您希望能够为常量值指定名称,然后使用名称而不是模式中的常量.然而,OCaml(像其他FP语言一样)不会那样工作.一个优点(在我看来)是它保持简单.