0xA*_*xAX 2 haskell types list
我是初学者.我尝试编写将返回倒数第二个列表元素的函数.
我开始这样说:
lastButOne :: [a] -> a
lastButOne list = if null list
then
0
else
length list
Run Code Online (Sandbox Code Playgroud)
0字符串我得到错误:
Couldn't match type `a' with `Int'
`a' is a rigid type variable bound by
the type signature for lastButOne :: [a] -> a
Run Code Online (Sandbox Code Playgroud)
我明白了.但我能在这做什么?我不知道列表类型.我能放在这里什么?
谢谢.
0的类型为int,因此它不适用于所有类型a.我建议改为使用Maybe a如下:
lastButOne :: [a] -> Maybe a
lastButOne [] = Nothing
lastButOne [x] = Nothing
lastButOne xs = Just $ list !! (length xs - 2)
Run Code Online (Sandbox Code Playgroud)
使用警卫:
lastButOne :: [a] -> Maybe a
lastButOne xs | length xs > 1 = Just $ list !! (length list - 2)
| otherwise = Nothing
Run Code Online (Sandbox Code Playgroud)
使用Maybe的MonadPlus实例:
import Control.Monad (guard)
lastButOne :: [a] -> Maybe a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))
Run Code Online (Sandbox Code Playgroud)
通常,对于MonadPlus的任何实例:
import Control.Monad (guard)
lastButOne :: MonadPlus m => [a] -> m a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))
Run Code Online (Sandbox Code Playgroud)
虽然在某处您必须指定编译器,您希望结果为Maybe.通常这将是类型推断,因为它将被传递给期望Maybe的函数.
请记住,这在O(n)中运行.您可能不希望找到列表中的倒数第二个元素...为什么需要这样做?至少考虑使用数组.