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

时间:2017-08-18 09:49:24

标签: haskell

如何获取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"

如何在不使用任何内置功能的情况下执行此操作?

2 个答案:

答案 0 :(得分:7)

您只需检查元素何时与Empty

相符
lastList :: List a -> a
lastList lst =
   case lst of
       Cons x Empty -> x
       Cons _ xs    -> lastList xs
       Empty        -> error "lastList of empty list"

答案 1 :(得分:3)

Cons Lisp 之类的列表,其中列表表示为链接列表。每个Cons h t都是h引用该节点(元素)的 head 的节点,尾部的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"