【发布时间】:2023-03-18 15:32:01
【问题描述】:
我有一个简单的整数定义,用一个无限列表完成:
nats = 0: map (+1) nats
我想制作一个打印每个元素的无限列表的版本。
我用Data.Trace (trace)做到了
nats = 0: map (\x -> 1 + trace (show x) x) nats
但这有点作弊。 使用 IO monad 正确执行此操作会更好。
我尝试使用以下代码使用IO [Int] 类型的无限列表:
nats' = (fmap f nats') >>= mapM (\x -> do{print x; return x})
where f l = 0:map (+1) l
类型签名有效,但是当我尝试使用 take 10 'nats 评估它时,
它陷入无限递归而没有打印任何内容。
这段代码有什么问题,类型签名正确吗?解决这个问题的正确方法是什么?
编辑 :我有这个问题的变体,我想创建一个包含用户所有输入的无限列表。 我该怎么做?
【问题讨论】:
-
您为什么要尝试将生成列表的任务与打印列表的任务结合起来?只要把它们分开,你的痛苦就会少很多。
标签: haskell printing io lazy-evaluation