1

我有以下示例代码

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

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

4

2 回答 2

9

首先sequence将数组放入IO [Int],然后maximum使用liftM

liftM maximum (sequence yourList) :: IO Int
于 2013-01-30T16:12:00.537 回答
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]
于 2013-01-30T16:14:00.460 回答