作为Count occurrence of an element in Haskell list and return max sequence的后续问题我
与其中一个given solutions一起玩
并想出了对原始问题的扩展:
是否有可能确定最长的序列
任何Vanilla
或Choco
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}}
答案 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
根据相等性对顺序元素进行分组,计算每个组的长度并选择最大长度。