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

时间:2015-03-05 13:35:37

标签: functional-programming ocaml

我最近开始学习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问了这个问题。根据我的建议,我要求溢出。

1 个答案:

答案 0 :(得分:3)

在这一行,

| _ :: t -> last t

什么是t?这是一个清单!这意味着它可以是(a :: a list)的cons单元格,也可以是[]。由于这种情况,与第一种情况一起,现在匹配每个可能的清单,无法达到第三种情况。