Haskell型数学问题

| 我是Haskell初学者。我尝试编写将返回倒数第二个列表元素的函数。 我开始是这样的:
lastButOne :: [a] -> a
lastButOne list = if null list
           then 
                0
           else 
                length list
0字符串我得到错误:
Couldn\'t match type `a\' with `Int\'
      `a\' is a rigid type variable bound by
          the type signature for lastButOne :: [a] -> a
我明白。但是我在这里能做什么?我不知道清单类型。我可以在这里放什么? 谢谢。     
已邀请:
        0是int类型,因此不适用于所有all2ѭ。我建议改为像这样使用ѭ3::
lastButOne :: [a] -> Maybe a
lastButOne [] = Nothing
lastButOne [x] = Nothing
lastButOne xs = Just $ list !! (length xs - 2)
使用警卫:
lastButOne :: [a] -> Maybe a
lastButOne xs | length xs > 1 = Just $ list !! (length list - 2)
              | otherwise = Nothing
使用Maybe的MonadPlus实例:
import Control.Monad (guard)

lastButOne :: [a] -> Maybe a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))
通常,对于MonadPlus的任何实例:
import Control.Monad (guard)

lastButOne :: MonadPlus m => [a] -> m a
lastButOne list = guard (length list > 1) >> return (list !! (length list - 2))
尽管您必须在某处向编译器指定希望将结果作为Maybe。通常,这将是类型推断的,因为它将被传递给期望Maybe的函数。 请记住,这在O(n)中运行。您可能不想找到列表的倒数第二个元素...为什么需要这样做?至少考虑使用数组代替。     
        签名说\“此函数获取具有任何类型元素的列表,并返回列表中所有元素相同元素的值\”。另一方面,代码说\“此函数获取包含任何类型元素的列表,并返回数字\”。正确的类型签名应为
[a] -> Int
*(\“此函数将获取包含任何类型元素的列表,并返回任何值为
Num
\”的值)。 但是,由于要返回倒数第二个元素而不是列表的长度,因此类型签名是正确的,但代码不是。您必须从列表中取出某些项,或者以某种方式(
error
,使用
Maybe
返回类型,使用模式matchign,并且在这些情况下仅忽略子句,返回
undefined :: a
)处理没有倒数第二个元素的列表因为它们少于两个元素。 (*)如果序曲
length
不仅仅表现performance15ѭ,那将是performance13ѭ。     
        我也是Haskell的新手。我认为您的问题是代码中的ѭ16。我真的不知道如何解决它,但是这是我的解决方案,希望对您有所帮助:
lastButOne :: [a] -> a

lastButOne [] = error \"empty list\"
lastButOne [x1] = error \"only one element\"
lastButOne [x1,x2] = x1
lastButOne (x:xs) = lastButOne xs
该函数从开始删除元素,直到剩下2个元素,然后这两个元素中的第一个是last-But-One。     
        绝妙的解决方案
lastButOne :: [a] -> a
lastButOne [] = error \"empty list\"
lastButOne [x] = x
lastButOne xs = head $ drop 1 $ reverse xs
    

要回复问题请先登录注册