访问`foldl`中的累加器和元素

Kev*_*ith 0 haskell scala fold

在Scala中foldLeft,我知道如何访问Scala中的accumulatorelement值,但不知道Haskell.

我可以foldLeft用来找出1到100之间,当除以3时,有多少数字的余数为1:

scala> List.range(1, 101).foldLeft(0){ (acc, elem) =>
     |    if (elem % 3 == 1) acc + 1
     |    else acc
     | }
res2: Int = 33
Run Code Online (Sandbox Code Playgroud)

我怎么能在Haskell中做同样的事情?

bhe*_*ilr 5

基本上是一对一的对应关系:

mySum :: [Int] -> Int
mySum xs = foldl (\acc elem ->
    if elem `mod` 3 == 1
        then acc + 1
        else acc
    ) 0 xs
Run Code Online (Sandbox Code Playgroud)

除了语法和参数的顺序之外,没有真正的区别.


对于未来的读者,建议避免foldl在实践中使用.由于实施中的懒惰,foldl大型列表可能发生空间泄漏.相反,有一个严格的版本foldl',可以用作插入式替换或右侧折叠foldr,具有位格式:

mySum xs = foldr (\elem acc ->    -- order of arguments swapped
    if elem `mod` 3 == 1
        then acc + 1
        else acc
    ) 0 xs
Run Code Online (Sandbox Code Playgroud)