我有以下代码来计算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
Run Code Online (Sandbox Code Playgroud)
现在,我如何返回该元素的最大序列,而不是绝对计数器?我的意思是,让我们说我的清单是:
[Vanilla,Choco,Choco,Vanilla,Choco]
Run Code Online (Sandbox Code Playgroud)
使用我的代码,我将获得3,因为列表中有3个Choco字符.我想要的是获得2,因为这是Choco字符的最大序列,而下一个序列更短.
我需要的是一些方法来比较序列,评估哪些更长,或类似的东西.
你可以使用group和maximum
import Data.List
maxSeqLength :: Eq a => [a] -> Int
maxSeqLength [] = 0
maxSeqLength xs = (maximum . map length . group) xs
Run Code Online (Sandbox Code Playgroud)
您可以使用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)
Run Code Online (Sandbox Code Playgroud)
该prev参数将跟踪当前连续Choco参数的数量.该acc参数将具有Choco上次运行的最大参数数量.每次遇到Vanilla价值时,它的价值都会更新.