我有以下示例代码
let x = [return 1::IO(Int), return 2::IO(Int)]
所以x是IO(Int)的列表。 如果列表中的内容为Ords,则maximum是一个返回列表最大值的函数。 如何“映射”最大值以在此IO(Int)s列表上运行?
答案 0 :(得分:9)
答案 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]