我正在尝试自学 Haskell。我尝试做的一件事是编写一个替代函数来返回列表的最后一个元素,方法是递归遍历列表,直到尾部为空集,然后返回头部。我有...
mylast [] = []
mylast (x:[]) = x
mylast (x:xs) = mylast xs
...但是当我尝试任何非空列表时出现错误:(
关于我做错了什么有什么建议吗?
TIA。
最佳答案
问题——就像你学习 Haskell 时的许多其他问题一样——是打字问题之一。在 GHCi 中键入以下内容
:t mylast
你会看到类型签名是
mylast :: [[a]] -> [a]
它需要一个列表列表并将返回一个列表。因此,如果您输入一个字符串列表 ["bob", "fence", "house"],该函数将按照您编写的那样工作。
问题是您的基本情况:mylast [] = [],它告诉编译器您要返回一个列表。你想返回一个元素,而不是一个列表。但是 Haskell 中没有空元素(非常设计),所以你需要使用 Maybe monad。
mylast :: [a] -> Maybe a
mylast [] = Nothing
mylast (x:[]) = Just x
mylast (x:xs) = mylast xs
Monad 是一个有点抽象的话题,但刚开始时你需要 Maybe monad。你只需要知道它是一个类型声明,它告诉编译器期待两种可能性:“Nothing”或“Just x”。然后返回的代码可以使用 x 并使用它运行,但如果你不使用“Just”,编译器会报错。
另一种方法是在遇到空列表时抛出错误,如下所示:
mynextlast [] = error "no empty lists allowed"
mynextlast (x:[]) = x
mynextlast (x:xs) = mynextlast xs
但我的怀疑是,也许是要走的路。
关于haskell - 实现最后一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1199887/