Haskell 类型签名 : Question on type signature of lastButOne Program

标签 haskell types

我正在通读《Real World 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

关于Haskell 类型签名 : Question on type signature of lastButOne Program,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58001891/

相关文章:

javascript - 如何在不使用循环的情况下将数组转换为 Javascript 中的对象?

Java 泛型 : why someObject. getClass() 不返回 Class<?延伸 T>?

haskell - 是否可以在派生 Generic 的记录数据类型中列出字段的名称和类型?

haskell - (++) 惰性求值的性能

C++ 类型和函数

function - foldl类型中 `t a -> b`的含义

typescript - 为什么 typescript 在实现抽象函数时忽略严格的空检查?

windows - 无法让 cabal 在 Windows 上找到 haskell-mpi 的 mpi 库

haskell - CHSC 的代码或可执行文件在哪里?

haskell - 从Haskell列表中删除重复的元素