我有这个功能
let tid = forkIO $ sequence_ ioOps
let ioOps = take 200 $ cycle $ intersperse (threadDelay (1000000*60*20)) $ mapM putStrLn stoJeLuka
我知道它不漂亮,但我只是在偷偷摸摸。
我正在尝试运行一个脚本,该脚本在特定时段输出stoJeLuka :: [String]
中提供的一个字符串。
我的问题是我的mapM
在我希望之前对putStrLn
进行评估。
如何在不评估这些list :: [IO a]
的情况下创建putStrLn
?
答案 0 :(得分:4)
mapM
几乎是sequence . map
,这意味着 将被评估并制作成动作。
您只想map putStrLn
- 这将创建类型[IO ()]
的列表,而无需执行所需的操作。当您希望打印时,只需列出sequence
该列表,或在foldl (>>) (return ())
内调用mapM_
。
答案 1 :(得分:3)
您的问题有点不清楚,因为您实际上还没有解释您希望代码执行的操作。但看起来有点可疑。具体而言,mapM putStrLn stoJeLuka
是生成列表的IO
操作;它实际上不是一个列表。因此,在其上调用intersperse
将产生类型错误。您可能打算使用map
或fmap
而不是mapM
。我猜测你的代码实际上可能已经这样做了,并且你在相对于你没有展示的其他代码执行这些事情时会抱怨。