最大IO(Int)列表

时间:2013-01-30 16:03:27

标签: haskell

我有以下示例代码

let x = [return 1::IO(Int), return 2::IO(Int)]

所以x是IO(Int)的列表。 如果列表中的内容为Ords,则maximum是一个返回列表最大值的函数。 如何“映射”最大值以在此IO(Int)s列表上运行?

2 个答案:

答案 0 :(得分:9)

首先将sequence数组加入IO [Int],然后使用maximum在其上运行liftM

liftM maximum (sequence yourList) :: IO Int

答案 1 :(得分:9)

这里的关键点是你无法比较IO个动作,只能比较值 这些行动产生的结果。要执行比较,您必须执行 那些回复结果列表的行动。幸运的是,有 一个能够做到这一点的函数:sequence :: (Monad m) => [m a] -> m [a]。 这将获取操作列表并执行它们以生成操作 这给出了一个结果列表。

要计算最大值,您可以执行类似

的操作
x = [return 1::IO(Int), return 2::IO(Int)]
...
biggest = maximum `fmap` sequence x :: IO [Int]