我写了这个小程序,我对它的行为有点困惑:
main = sequence $ iterate (printAdd =<<) (pure 0)
printAdd x = do
l <- getLine
let y = x + read l
print y
pure y每次输入一个新的整数时,我都希望它打印所有整数的和。它确实或多或少地工作,但是累加器被多次重置为0。这种重置发生在第一个输入之后、第三个输入之后、第六个输入之后等等(也就是说,它总是比以前多一个输入)。
这一切为什么要发生?
我怎样才能阻止它的发生?
发布于 2021-10-07 02:18:00
iterate给出了一个printAdd链逐渐长的列表。
iterate返回一个列表,其中每个元素都是通过将函数应用到前一个元素来给出的。在医生们中,您可以看到下图:
iterate f x == [x, f x, f (f x), ...]在你的例子中,f = (printAdd =<<)和x = pure 0。因此,您的列表将如下所示:
iterate (printAdd =<<) (pure 0) =
[pure 0, (printAdd =<< pure 0), (printAdd =<< printAdd =<< pure 0), ...]每个n个元素都是一个N个printAdd调用链,其中一个零输入到第一个
然后sequence按顺序执行所有这些元素。零不做任何操作,第一个读取一个数字并打印它,第二个读取一个数字,然后打印另一个数字,然后打印和,等等。每个N元素读取N个数字并打印它们的滚动和。
https://stackoverflow.com/questions/69474463
复制相似问题