计算Haskell列表中任何元素的出现次数,并使用工作模式返回最大序列

时间:2015-03-23 14:21:34

标签: haskell

作为Count occurrence of an element in Haskell list and return max sequence的后续问题我 与其中一个given solutions一起玩 并想出了对原始问题的扩展: 是否有可能确定最长的序列 任何VanillaChoco Elem使用的Strawberries worker pattern

我到目前为止唯一可能出现的是给定的两个Elem数据类型,但我感兴趣的是任意数量的不同类型(在示例中为data Elem = Vanilla | Choco deriving (Eq, Show) maxStarSeq :: [Elem] -> Int maxStarSeq xs = aux xs 0 0 0 0 where aux [] acc prev bcc prev2 = max acc $ max prev $ max bcc prev2 aux (Vanilla:xs) acc prev bcc prev2 = aux xs (max acc prev) 0 bcc (prev2 + 1) aux (Choco:xs) acc prev bcc prev2 = aux xs acc (prev + 1) (max bcc prev2) 0 等)。

{{1}}

1 个答案:

答案 0 :(得分:4)

您可以将该函数概括为适用于支持相等性测试的任何类型(是Eq的实例),因此您不必担心不同构造函数的数量。

maxSeq :: Eq a => [a] -> Int
maxSeq [] = 0
maxSeq (x:xs) = go 1 1 x xs where
    go longest current _ [] = max longest current
    go longest current prev (x:xs)
        | x == prev = go longest (current + 1) prev xs
        | otherwise = go (max longest current) 1 x xs

longest参数跟踪我们到目前为止遇到的最长序列(无论值是多少),current保持当前序列的长度,prev是我们可以检查当前序列是否继续。

但是,建议的方法不是使用辅助功能,而是编写现有的标准库功能:

import Data.List (group)

maxSeq :: Eq a => [a] -> Int
maxSeq = maximum . map length . group

根据相等性对顺序元素进行分组,计算每个组的长度并选择最大长度。