首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell迭代(f : IO a -> IO a)

Haskell迭代(f : IO a -> IO a)
EN

Stack Overflow用户
提问于 2021-10-07 01:40:47
回答 1查看 93关注 0票数 2

我写了这个小程序,我对它的行为有点困惑:

代码语言:javascript
复制
main = sequence $ iterate (printAdd =<<) (pure 0)

printAdd x = do
  l <- getLine
  let y = x + read l
  print y
  pure  y

每次输入一个新的整数时,我都希望它打印所有整数的和。它确实或多或少地工作,但是累加器被多次重置为0。这种重置发生在第一个输入之后、第三个输入之后、第六个输入之后等等(也就是说,它总是比以前多一个输入)。

这一切为什么要发生?

我怎样才能阻止它的发生?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-07 02:18:00

iterate给出了一个printAdd链逐渐长的列表。

iterate返回一个列表,其中每个元素都是通过将函数应用到前一个元素来给出的。在医生们中,您可以看到下图:

代码语言:javascript
复制
iterate f x == [x, f x, f (f x), ...]

在你的例子中,f = (printAdd =<<)x = pure 0。因此,您的列表将如下所示:

代码语言:javascript
复制
iterate (printAdd =<<) (pure 0) = 
  [pure 0, (printAdd =<< pure 0), (printAdd =<< printAdd =<< pure 0), ...]

每个n个元素都是一个N个printAdd调用链,其中一个零输入到第一个

然后sequence按顺序执行所有这些元素。零不做任何操作,第一个读取一个数字并打印它,第二个读取一个数字,然后打印另一个数字,然后打印和,等等。每个N元素读取N个数字并打印它们的滚动和。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69474463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档