我想检查列表中的下一个元素是否与前一个元素相同,并使用递归函数和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 ....
完成/更改/代码应该是直接的,希望。