如何在哈斯克尔中获取列表中的最后一个元素?我在下面编写了一些代码:
lastList :: List a -> a
lastList lst =
case lst of
Cons x xs -> lastList xs
Cons _ xs -> lastList xs
Empty -> error "lastList of empty list"
如何在不使用任何内置函数的情况下执行此操作?
你只需要检查一个元素什么时候是缺点与Empty
:
lastList :: List a -> a
lastList lst =
case lst of
Cons x Empty -> x
Cons _ xs -> lastList xs
Empty -> error "lastList of empty list"
Cons
是一个类似Lisp的列表,其中列表表示为链表。每个Cons h t
都是一个节点,其中h
引用该节点的头部(元素(,t
指向列表尾部:其余部分。此外,列表的末尾(空列表(在这里用Empty
表示。
因此,这意味着具有一个元素x
的列表表示为Cons x Empty
(这相当于[x]
(。如果我们遇到这种情况,我们必须返回x
,因为具有一个元素的列表的最后一个元素就是该元素。
所以问题是如果我们有一个Cons h t
,t
不Empty
该怎么办。在这种情况下,列表看起来像[x1,x2,...]
.现在该列表的最后一个元素与[x2,x3,...]
列表的最后一个元素相同,因此我们可以在尾部使用递归。
最后,我们必须找到一种方法来解决为函数提供空列表的情况。在这种情况下,我们可能最好提供一个error
.
因此,我们可以像以下方式实现它:
lastList :: List a -> a
lastList (Cons h Empty) = h
lastList (Cons _ t) = lastList t
lastList Empty = error "An empty list has no lastElement"