IO(Int) 列表的最大值



我有以下示例代码

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]

最新更新