如何获取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"
如何在不使用任何内置功能的情况下执行此操作?
答案 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"