Haskell型数学问题

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)

我明白了.但我能在这做什么?我不知道列表类型.我能放在这里什么?

谢谢.

alt*_*ive 5

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)中运行.您可能不希望找到列表中的倒数第二个元素...为什么需要这样做?至少考虑使用数组.