我最近开始学习OCaml并遇到了以下问题:
*编写一个返回列表最后一个元素的函数last : 'a list -> 'a option
。 *
我尝试了以下代码:
# let rec last = function
| [] -> None
| _ :: t -> last t
| [x] -> Some x;;
我收到了以下回复:
Characters 65-68:
Warning 11: this match case is unused.
val last : 'a list -> 'a option = <fun>
但是下面的代码编译没有错误:
# let rec last = function
| [] -> None
| [x] -> Some x
| _ :: t -> last t;;
给出回复
val last : 'a list -> 'a option = <fun>
所以,我怀疑为什么只是通过更改我收到错误的顺序?
任何评论和指导都将受到高度赞赏。
我在programmers.stackexchange问了这个问题。根据我的建议,我要求溢出。
答案 0 :(得分:3)
在这一行,
| _ :: t -> last t
什么是t
?这是一个清单!这意味着它可以是(a :: a list)
的cons单元格,也可以是[]
。由于这种情况,与第一种情况一起,现在匹配每个可能的清单,无法达到第三种情况。