我正在阅读真实世界的Haskell,其中的一项练习是构造一个函数lastButOne,该函数仅返回列表的倒数第二个元素。
到目前为止,我的代码:
lastButOne xs = if null xs || length xs == 1
then []
else if length xs == 2
then head xs
else lastButOne (tail xs)
我的问题:
输入应该是一个列表,如果它是非空的或长度为1,则返回一个空列表,在其他情况下,返回倒数第二个元素。但是,输入列表时出现错误。输入第二级嵌套列表时没有任何错误。
我怀疑类型签名有问题,当我调用类型签名时,它返回
lastButOne :: [[a]] -> [a].
但我希望类型签名为
[a] -> a
。我盯着这个功能已经有一段时间了,还浏览了其他文章,但是我似乎无法弄清楚为什么类型签名是[[a]] -> a
。任何提示将不胜感激。 最佳答案
您可以通过以下模式匹配来实现:
lastButOne :: [a] -> a
lastButOne [] = error "not elements"
lastButOne [x] = x
lastButOne [x,_] = x
lastButOne (x:xs) = lastButOne xs