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

计算Haskell列表中任何元素的出现次数,并使用辅助模式返回最大序列,haskell,Haskell,作为我的后续问题 和其中一个孩子玩耍 并对原来的问题进行了扩展: 有可能确定最长的序列吗 无论是香草还是巧克力,我都会用 到目前为止,我唯一能想到的可能是给定的两种Elem数据类型,但我感兴趣的是示例I中任意数量的不同类型。E草莓等 您可以将该函数推广到支持Eq实例的任何类型,因此您不必担心不同构造函数的数量 maxSeq :: Eq a => [a] -> Int maxSeq [] = 0 maxSeq (x:xs) = go 1 1 x xs where go lon

作为我的后续问题 和其中一个孩子玩耍 并对原来的问题进行了扩展: 有可能确定最长的序列吗 无论是香草还是巧克力,我都会用

到目前为止,我唯一能想到的可能是给定的两种Elem数据类型,但我感兴趣的是示例I中任意数量的不同类型。E草莓等


您可以将该函数推广到支持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
最长参数跟踪到目前为止遇到的最长序列,而不考虑值,current保留当前序列的长度,prev是前一个元素的值,以便我们可以检查当前序列是否继续

但是,建议的方法不是使用辅助函数,而是组合现有的标准库功能:

import Data.List (group)

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

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

您可以将该函数推广到支持相等性测试的任何类型上,这是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
最长参数跟踪到目前为止遇到的最长序列,而不考虑值,current保留当前序列的长度,prev是前一个元素的值,以便我们可以检查当前序列是否继续

但是,建议的方法不是使用辅助函数,而是组合现有的标准库功能:

import Data.List (group)

maxSeq :: Eq a => [a] -> Int
maxSeq = maximum . map length . group
这将基于相等性对顺序元素进行分组,计算每个组的长度,并拾取最大长度