我正在尝试在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
或者这是一个错误的建议?
答案 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)
获取第二项的最简单方法是使用!!
中缀运算符。它允许您访问列表中的特定项目。通常情况下,对于大多数列表来说这太慢了,但因为它只是第二项,所以它并不重要。