计算Haskell列表中元素的出现次数并返回最大序列

时间:2015-03-19 10:12:49

标签: list haskell

我有以下代码来计算Haskell列表中元素的出现次数:

data Elem = Vanilla | Choco deriving (Eq,Show)
maxStarSeq :: [Elem] -> Int
maxStarSeq [] = 0
maxStarSeq (Vanilla:xs) = 0 + maxStarSeq xs
maxStarSeq (Choco:xs) = 1 + maxStarSeq xs

现在,我怎样才能返回该元素的最大序列,而不是绝对计数器?我的意思是,我的名单是:

[Vanilla,Choco,Choco,Vanilla,Choco]

使用我的代码,我会得到3,因为列表中有3个Choco字符。我想要的是获得2,因为这是Choco字符的最大序列,而下一个序列更短。

我需要的是在序列之间进行比较,评估哪个更长或类似的东西。

2 个答案:

答案 0 :(得分:8)

您可以使用groupmaximum

import Data.List
maxSeqLength :: Eq a => [a] -> Int
maxSeqLength [] = 0
maxSeqLength xs = (maximum . map length . group) xs

答案 1 :(得分:5)

您可以使用worker wrapper模式来达到所需的结果:

maxStarSeq :: [Elem] -> Int
maxStarSeq xs = aux xs 0 0
    where aux [] acc prev = max acc prev
          aux (Vanilla:xs) acc prev = aux xs (max acc prev) 0
          aux (Choco:xs) acc prev = aux xs acc (prev + 1)

prev参数将跟踪当前连续Choco个参数的数量。 acc参数将具有上次运行的最大Choco参数数。每次遇到Vanilla值时,它的值都会更新。