我有这个函数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))))
有什么问题?谢谢
答案 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