如何基于IO Int值对列表进行排序

时间:2013-04-25 00:34:27

标签: haskell monads

我有一个[(String, [String], IO Int)]列表,我想排序。 sortBy (\x -> ...) list要求我使用IO来获取IO Int的内部值,这意味着我无法Ordering只返回IO Ordering sortBy功能。有没有办法对列表进行排序?

1 个答案:

答案 0 :(得分:7)

每个元组的第三个元素是IO Int,因此它的值取决于外部世界。因此,排序列表的顺序取决于外部世界。所以不,没有办法让[(String, [String], IO Int)]IO Int的值排序。

给你另一个IO [(String, [String], Int)],它将产生一个按sortBy排序的列表。这不是一个纯粹的列表,但是您可以将任何其他纯函数注入IO monad以对其执行任意纯计算。

这样的事情可以做到:

IO [(String, [String], Int)]

我应该提一下,因为它可能并不明显,这将按照它们最初出现在列表中的顺序运行Int个动作。但是要对它们进行排序,您必须运行它们才能获得IO值,并且必须以某些顺序运行它们。