使用递归返回 haskell 中列表的最后一个元素



如何在哈斯克尔中获取列表中的最后一个元素?我在下面编写了一些代码:

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 ttEmpty该怎么办。在这种情况下,列表看起来像[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"

最新更新