Kev*_*ith 0 haskell scala fold
在Scala中foldLeft,我知道如何访问Scala中的accumulator和element值,但不知道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中做同样的事情?
基本上是一对一的对应关系:
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)