这是我的代码,但是,我不知道怎么回事,这是我的代码:
ll :: [a] -> a
ll lis = case lis of
(_:xs) -> ll xs
[] -> error"xx"
并且终端没有错误消息: 但是当我运行“ll [1,2,3]”时,我想得到“3”,但是,我得到“ * 例外:xx”的结果。
谁愿意告诉我它有什么问题?谢谢XD
答案 0 :(得分:12)
你永远不会返回列表的最后一个元素。第一个case子句删除非空列表的第一个元素,然后递归调用ll
。最终,你会遇到空列表情况,因此错误会被提升。
答案 1 :(得分:5)
我发现从递归的基本情况开始是有帮助的:
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'
从左到右挖掘列表时,它会给你最后一个元件。
答案 2 :(得分:1)
使用预定义函数的最简单实现:
ll = head . reverse