如何在Haskell中创建非评估映射?

时间:2015-01-11 11:39:03

标签: haskell monads

我有这个功能

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

2 个答案:

答案 0 :(得分:4)

mapM几乎是sequence . map,这意味着 将被评估并制作成动作。

您只想map putStrLn - 这将创建类型[IO ()]的列表,而无需执行所需的操作。当您希望打印时,只需列出sequence该列表,或在foldl (>>) (return ())内调用mapM_

答案 1 :(得分:3)

您的问题有点不清楚,因为您实际上还没有解释您希望代码执行的操作。但看起来有点可疑。具体而言,mapM putStrLn stoJeLuka生成列表的IO操作;它实际上不是一个列表。因此,在其上调用intersperse将产生类型错误。您可能打算使用mapfmap而不是mapM。我猜测你的代码实际上可能已经这样做了,并且你在相对于你没有展示的其他代码执行这些事情时会抱怨。