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

noo*_*arp 2 haskell list

我有以下代码来计算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字符的最大序列,而下一个序列更短.

我需要的是一些方法来比较序列,评估哪些更长,或类似的东西.

Lee*_*Lee 8

你可以使用groupmaximum

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

  • @BranStark你是什么意思?该解决方案确实使用模式匹配. (2认同)

Sib*_*ibi 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)
Run Code Online (Sandbox Code Playgroud)

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