我有以下示例代码
let x = [return 1::IO(Int), return 2::IO(Int)]
所以 x 是 IO(Int) 的列表。max 是一个函数,如果列表中的事物是 Ords,则返回列表的最大值。如何"映射"在此 IO(Int) 列表上运行的最大数量?
首先将数组sequence
IO [Int]
,然后使用 liftM
在其上运行maximum
:
liftM maximum (sequence yourList) :: IO Int
这里的关键点是你不能比较IO
操作,只能比较值这些行动的结果。要执行比较,您必须执行这些操作以获取结果列表。幸运的是,有一个可以做到这一点的函数:sequence :: (Monad m) => [m a] -> m [a]
.这将获取操作列表并执行它们以生成操作这给出了一个结果列表。
要计算最大值,您可以执行以下操作
x = [return 1::IO(Int), return 2::IO(Int)]
...
biggest = maximum `fmap` sequence x :: IO [Int]