为什么我在第一种情况下出现错误,而在第二种情况下却没有?

Why am I getting an error in first case but not in second?

最近开始学习OCaml,遇到了以下问题:

*编写一个函数 last : 'a list -> 'a option 来 returns 列表的最后一个元素。 *

我尝试了以下代码:

# 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 上问了这个问题。根据建议,我在溢出时问。

在这一行中,

| _ :: t -> last t

什么是t?这是一个列表!这意味着它可以是 (a :: a list) 的一个 cons cell,也可以是 []。由于这种情况与第一种情况现在匹配所有可能的列表,因此无法达到第三种情况。