haskell - 实现最后一个函数

标签 haskell

我正在尝试自学 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/

相关文章:

haskell - 如何使用重复变量以无点样式重写?

haskell - 在哪里可以找到应用仿函数的编程练习?

haskell - 如何避免必须显式编写复合KnownNat 约束?

haskell - 元组爆炸模式

haskell - 求解(两个以上)线性不等式系统

haskell - 如果多路导致 HLint 忽略解析错误?

linux - 在 GHC 的堆分析器的 View 之外可能发生哪些内存泄漏

haskell - 在Haskell中实现语言解释器

haskell - 详尽定义的功能中的非详尽模式

haskell - Haskell中的美元符号($)和id函数之间有关系吗?