列表中的lastList函数,而不调用Haskell中的Prelude

时间:2017-08-23 18:14:36

标签: list haskell

我有这个函数lastList,它假设调用列表的最后一个元素。我需要手动完成,没有在Prelude中预定义的“last”。 到目前为止我有这个代码

lastList :: List a -> a
lastList list = case list of
    Empty -> error "List is empty"
    Cons _ xs -> lastList xs

它给我一个带有列表

的输出“List is empty”
test3 :: List Double
test3 = Cons 1.3 (Cons 5.2 (Cons 3.0 (Cons 8.7 (Cons 9.1 Empty))))

有什么问题?谢谢

1 个答案:

答案 0 :(得分:6)

问题:您只将Empty定义为basecase,这会出错。因此,每个非无限列表最终都会导致Empty基础和错误。无限列表将永远循环,但这是我们无法规避的事情,因为无限列表根本没有最后一个元素。

由于List是一个链接列表,其中head(是一个元素)和tail(列表的其余部分)为Cons head tail,一个Empty,一个包含一个元素的列表因此Cons x Empty。这意味着如果我们获得这样的模式,我们应该返回x

此外,如果tail不是Empty,我们应该在尾部执行递归,直到我们获得只剩下一个元素的列表。

如果列表为Empty,则列表为空,因此我们应该在此输入上出错。

lastList :: List a -> a
lastList Empty = error "List is empty"
lastList (Cons x Empty) = x
lastList (Cons _ xs) = lastList xs