【问题标题】:How can I create a non-evaluated mapping in Haskell?如何在 Haskell 中创建非评估映射?
【发布时间】:2015-01-11 23:23:42
【问题描述】:

我有这个功能

let tid = forkIO $ sequence_ ioOps
let ioOps = take 200 $ cycle $ intersperse (threadDelay (1000000*60*20)) $ mapM putStrLn stoJeLuka

我知道它不漂亮,但我只是在破解。

我正在尝试运行一个脚本,该脚本在特定时期输出stoJeLuka :: [String] 中提供的字符串之一。

我的问题是我的mapM 在我想要之前评估了putStrLn。 如何在不评估这些 putStrLn 的情况下只创建 list :: [IO a]

【问题讨论】:

    标签: haskell monads


    【解决方案1】:

    mapM 几乎是sequence . map,这意味着它被评估并变成一个动作。

    您只想简单地map putStrLn - 这将创建一个[IO ()] 类型的列表而不执行所需的操作。当您想要打印它时,只需 sequence 该列表,或在其上调用 foldl (>>) (return ()),就像在 mapM_ 中一样。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我已经说了我想做的,没有其他相关的代码
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2013-04-09
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 2011-11-28
      相关资源
      最近更新 更多