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

lib*_*bra 3 haskell exception list

这是我的代码,但是,我不知道它是怎么回事,这是我的代码:

ll :: [a] ->  a
ll lis = case lis of
  (_:xs) -> ll xs
  [] -> error"xx"
Run Code Online (Sandbox Code Playgroud)

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

谁喜欢告诉我它有什么问题?谢谢XD

tom*_*tom 12

你永远不会返回列表的最后一个元素.第一个case子句删除非空列表的第一个元素,然后递归调用ll.最终,您将点击空列表案例,因此会引发错误.

  • @libra那是因为`(_:xs)`模式已匹配`[x]`.把那个放在第一位. (7认同)

Lan*_*dei 5

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

ll [x] = x
Run Code Online (Sandbox Code Playgroud)

然后是递归:

ll (_:xs) = ll xs
Run Code Online (Sandbox Code Playgroud)

当然,给出一个有用的错误信息是好的风格.当没有案例匹配时,最后这样做通常很方便:

ll _ = error "empty list"
Run Code Online (Sandbox Code Playgroud)

作为WTF的奖励!?!版:

import Data.List

ll = foldl' (flip const) (error "empty list")
Run Code Online (Sandbox Code Playgroud)

你可以调用flip const"阿尔茨海默氏症的功能",它只是忘记它的第一个参数并返回第二个参数,并且foldl'从左到右挖掘列表,它会给你最后一个元素.