第二个最新的列表项Haskell

时间:2014-09-16 14:03:21

标签: haskell

我正在尝试在Haskell的列表中获取第二项。我认为最好的方法就是获得列表尾部的头部。

secondMostRecentChoice :: History -> Choice // a choice is just a Bool like Bake | NoBake
secondMostRecentChoice [] = "Not Enough History"
secondMostRecentChoice history = 
    if ( length history == 1 ) 
        then "Still Not Enough History"
    else if (length history >= 2)
        then (head [b | (head a,b) <- history]) //Here is the problem
        else "Not supposed to be here"
    else "Not supposed to be here"

但我得到以下内容:

  
    

模式中的解析错误:头部         可能是由于缺少“做”而导致的。

  

为什么我需要做do或者这是一个错误的建议?

3 个答案:

答案 0 :(得分:9)

最简单的方法就是模式匹配它。

secondElem :: [a] -> Maybe a
secondElem (_:x:_) = Just x
secondElem _       = Nothing

答案 1 :(得分:5)

我会使用模式匹配,因为它更清楚失败模式是什么:

   second :: [a] -> a
   second []      = error "Empty list"
   second [x]     = error "Singleton list"
   second (_:x:_) = x

更清楚,不是吗?使规范显而易见。

答案 2 :(得分:0)

获取第二项的最简单方法是使用!!中缀运算符。它允许您访问列表中的特定项目。通常情况下,对于大多数列表来说这太慢了,但因为它只是第二项,所以它并不重要。