【问题标题】:Count occurrence of an element in Haskell list and return max sequence计算 Haskell 列表中某个元素的出现次数并返回最大序列
【发布时间】:2015-03-19 10:12:48
【问题描述】:

我有以下代码来计算 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

现在,如何返回该元素的最大序列,而不是绝对计数器?我的意思是,假设我的清单是:

[Vanilla,Choco,Choco,Vanilla,Choco]

使用我的代码,我会得到 3,因为列表中有 3 个 Choco 字符。我想要的是得到 2,因为那是 Choco 字符的最大序列,而下一个序列更短。

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

【问题讨论】:

    标签: list haskell


    【解决方案1】:

    您可以使用groupmaximum

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

    【讨论】:

    • 谢谢!有没有其他方法,只使用模式匹配?
    • @BranStark 你是什么意思?该解决方案确实使用了模式匹配。
    【解决方案2】:

    您可以使用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)
    

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

    【讨论】:

    • 我正在尝试应用这个,但是编译器在最后一行给我一个错误:输入辅助上的解析错误
    • @BranStark 很可能是您的源代码中的缩进问题。确保所有“辅助”都垂直对齐。
    • 所有这些都垂直对齐,但仍然出现此错误。我错过了什么?
    • @BranStark 您很可能缺少制表符和空格。使用空格缩进。
    • 你能给我一个在这种精确情况下正确缩进的例子吗?抱歉,使用 Haskell 的第一周。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    相关资源
    最近更新 更多