连续列表元素的Haskell模式匹配



我想检查列表中的下一个元素是否与前一个元素相同,并使用递归函数和Haskell中的模式匹配增加计数,我该如何做到这一点?我在想这样写:

mrn [] = 0
mrn [x] = 1
mrn (x:xs) 
|(x == mrn xs) = --what do I increment here? 
otherwise --what here?

如果下一个元素不相同,我想重置计数,并将前一个计数存储在其他地方

我们不将数据存储在其他任何地方,而是存储在函数的输出或参数中,从一次调用到另一次调用更新它们,因为Haskell中的数据是不可变的——如果x = 42,那么它42。

这意味着对count参数使用0的初始值。它必须由内部的"工人"使用。在函数内部定义的函数,以免用不相关的实现细节污染全局空间。

和匹配两个连续的元素,我们使用(x:y:xs)模式:

countDups :: [a] -> Integer
countDups xs  =  go xs 0
where
go []  count = count
go [x] count = count
go (x:y:xs) count
| your test = go (y:xs) (count+1)
| otherwise = go (y:xs) count

您将需要做必要的修正,以便它能做您想要的,适当地改变守卫中的测试。

以上将计算列表中的所有重复项。如果您想要其他东西,即获取所有连续计数的列表,那么您将需要让函数创建该列表:

dupCounts :: [a] -> [Integer]
dupCounts xs  =  go xs 0 False
where
go []  count previousIsSame = [count]
go [x] count previousIsSame = [count]
go (x:y:xs) count previousIsSame 
| your test = go (y:xs) (count+1) ....
| otherwise = x : go (y:xs) 0 ....

完成/更改/代码应该是直接的,希望。

相关内容

  • 没有找到相关文章

最新更新