累加器如何在Haskell中工作?

时间:2018-03-23 07:41:19

标签: haskell

你好我试图通过创建以下方法来了解累加器是如何工作的:

它接收一个数字并创建一个元组:(sum [0..nr], [0..nr])。例如,给定4,它应该返回(10, [0,1,2,3,4])

这是我的代码:

accu :: Int -> (Int, [Int])
accu 0  = (0, [0])
accu nr = go (0, []) nr where   --I do not get this line, mainly the first argument
            go (s,ls) 0  = (s, 0:ls)
            go (s,ls) nr = go (s+nr, nr:ls) (nr-1)

我不明白累加器如何改变它的值,因为它不是一个函数,因此它不应该是不可变的?在我的情况下,它不应该像一个常数吗?

2 个答案:

答案 0 :(得分:3)

go是使用where关键字在本地定义的函数,然后直接在accu函数中使用。看看这里: http://learnyouahaskell.com/syntax-in-functions#where

这意味着累加器并没有真正改变,它只是每次递归调用go函数时的不同累加器。最后一行将使用新的累加器值递归调用go函数。

答案 1 :(得分:0)

为什么不简单地做。

(\n -> (sum [0..n], [0..n])) 4
(10,[0,1,2,3,4])

或者这个更干净但更长。

(\n -> (\l -> (sum l, l)) [0..n]) 5
(15,[0,1,2,3,4,5])