努力从列表中取出最后一个元素(Haskell)



这是我的代码,然而,我不知道它是怎么错的,这是我的代码:

ll :: [a] ->  a
ll lis = case lis of
  (_:xs) -> ll xs
  [] -> error"xx"

并且没有来自终端的错误消息:但是当我运行"ll[1,2,3]"时,我想得到"3",然而,我得到的结果是"* Exception: xx"。

谁愿意告诉我它有什么问题?由于XD

永远不会返回列表的最后一个元素。第一个case子句删除非空列表的第一个元素,然后递归地调用ll。最后,您将遇到空列表情况,因此会引发错误。

我发现从递归的基本情况开始是有帮助的:

ll [x] = x

然后递归:

ll (_:xs) = ll xs
当然,给出一个有用的错误信息是很好的风格。通常在没有匹配的情况下,最后执行此操作比较方便:
ll _ = error "empty list"

作为奖励WTF!?!版本:

import Data.List
ll = foldl' (flip const) (error "empty list")

您可以将flip const称为"阿尔茨海默氏函数",它只是忘记了它的第一个参数并返回第二个参数,并且当foldl'从左到右遍历列表时,它将给出最后一个元素。

使用预定义函数的最简单实现:

ll = head . reverse

最新更新