你好我试图通过创建以下方法来了解累加器是如何工作的:
它接收一个数字并创建一个元组:(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)
我不明白累加器如何改变它的值,因为它不是一个函数,因此它不应该是不可变的?在我的情况下,它不应该像一个常数吗?
答案 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])