【发布时间】:2017-12-20 03:53:56
【问题描述】:
我编写了以下代码来查找haskell中列表的最后一个元素:
myLast (x:xs) = do
ret <- if xs == [] then x else (myLast xs)
return ret
这个想法是遍历列表,直到我们到达一个以空列表作为下一个元素的元素。当我们找到它时,我们将ret 设置为该元素。
这对我来说很有意义,但是当我在交互式 shell 中运行代码时,我收到以下错误:
<interactive>:1:1: error:
• No instance for (Num (m0 b0)) arising from a use of ‘it’
• In a stmt of an interactive GHCi command: print it
编辑 1
我使用do 的原因是因为我看到该模式在某处也用于遍历列表,所以我想我可以在这里做同样的事情。我暂时避免使用图书馆以适应这种语言。
我编写了避免使用 do 关键字的函数,现在它可以工作了:
myLast(x:xs) = if xs == [] then x else (myLast xs)
现在只有空列表案例存在问题。如何在 haskell 中解决这个问题?
【问题讨论】:
-
您为什么使用
do表示法?你认为你使用的是什么 Monad? -
请不要使用
do表示法,除非你确信你需要monads(你在这里不需要这些),而且同样适用于return. -
==是一个库函数(实际上是一个类方法)。尽管通常没有理由避免使用库函数,但您实际上希望在此处避免使用==,因为按照您的方式使用它会对列表的元素施加Eq约束。您可以将xs == []替换为null xs来解决问题,但是做更多的模式匹配似乎更好一些。 -
我认为你应该检查
return的实际作用。 not 会返回你从其他语言中知道的内容。在 Haskell 中你应该把它理解为“回归 monad”,所以return :: a -> [a]
标签: list haskell functional-programming