我对 Haskell 完全陌生,如果这个问题很愚蠢,我深表歉意。
我想要做的是递归地建立一个列表,同时建立一个基于递归调用的累积值。这是针对我正在为 Coursera 课程做的一个问题,所以我不会发布确切的问题,而是发布类似的问题。
例如,我想获取一个整数列表并将每个整数加倍(出于示例的目的,我可以使用 忽略map
),但我还想计算数字“5”出现在列表中的次数。
所以要加倍我可以这样做:
foo [] = []
foo (x:xs) = x * 2 : foo xs
到目前为止很容易。但是我怎样才能保持对五是多少次的计数x
呢?我得到的最好的解决方案是使用这样的显式累加器,我不喜欢它反转列表,所以你需要在最后做一个反转:
foo total acc [] = (total, reverse acc)
foo total acc (x:xs) = foo (if x == 5 then total + 1 else total) (x*2 : acc) xs
但我觉得这应该能够由State
我以前没有使用过的 monad 更好地处理,但是当我尝试构建一个符合我所见模式的函数时,由于递归调用foo
. 有没有更好的方法来做到这一点?
编辑:我需要它来处理很长的列表,所以任何递归调用也需要是尾递归的。(由于 Haskell 的 'tail recursion modulo cons',我这里的例子是尾递归的)。