mylast :: (Eq a) => [a] -> a
mylast x:[] = "Last element is " ++ x
mylast x:xs = mylast xs
我想找到作为mylast函数输入的List L的最后一个元素。 由于List可能包含整数或字符或字符串,因此我使用Eq类型类来指示列表元素的类型应属于Eq.But我收到以下错误: LastEle.hs:2:1:模式中的解析错误:mylast
答案 0 :(得分:2)
有些事情是错的。
您需要围绕(x:[])
和(x:xs)
的模式匹配括号。
您还缺少空列表的案例,因此会崩溃。处理此问题的一种更安全的方法是使用Maybe
,在空列表中返回Nothing
。您可以让您的程序在空列表中崩溃,但这通常被视为不良格式。 Maybe
类型允许您以最简单的方式明确声明您的函数可能返回不成功的结果。在其他语言中,您可能会在输入错误时返回null
。
您不需要Eq
类型类,因为您没有比较任何内容。此外,当您的声明声明您应该返回类型a
的值时,您将返回一个String。我推荐这个实现:
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (_:xs) = mylast xs
现在,您可以使用mylast
的结果显示您在示例中显示的原始文本,如果提供了空列表,您还可以显示友好消息(而不是崩溃):
displayLast :: Show a => [a] -> String
displayLast list =
case mylast list of
Nothing -> "The list was empty!"
Just lastItem -> "Last element is " ++ (show lastItem)
答案 1 :(得分:-2)
Prelude> :info last
last :: [a] -> a -- Defined in `GHC.List'
Prelude> last [1..10]
10
Prelude> last []
*** Exception: Prelude.last: empty list