这是我书中的一小段代码,我不确定匹配的工作方式,因为似乎第一种情况匹配了所有内容。以下是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

最佳答案

这是相当普遍的困惑根源。本质上,您想将模式视为由常量(例如01)和由模式绑定(bind)的标识符构建而成。

当标识符以某种模式显示时,它将完全匹配任何内容,并将匹配的值绑定(bind)到该标识符。模式中的标识符不引用与该标识符关联的任何先前值。因此,确实,您的模式将始终匹配第一种情况,并将zero绑定(bind)到i的值。

您可以想象,您希望能够给名称赋予常量值,然后在模式中使用名称而不是常量。但是,OCaml(与其他FP语言一样)不能那样工作。一个优点(对我而言似乎是)使事情变得简单。

关于pattern-matching - 为什么OCaml模式 `zero -> zero`似乎可以匹配所有内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9058849/

10-11 04:16