gpt4 book ai didi

haskell - 如何根据 IO Int 值对列表进行排序

转载 作者:行者123 更新时间:2023-12-02 15:06:01 24 4
gpt4 key购买 nike

我有一个 [(String, [String], IO Int)] 列表,我想对其进行排序。 sortBy (\x -> ...) list 要求我使用 IO 来获取 IO Int 的内部值,这意味着我无法返回 Ordering,但仅对 sortBy 函数进行 IO Ordering。有什么办法可以对列表进行排序吗?

最佳答案

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

可以做的是设置IO [(String, [String], Int)]的值,然后提升sortBy 将函数插入 IO monad 中,为您提供另一个 IO [(String, [String], Int)] ,该列表将生成按以下顺序排序的列表Int。这不是一个纯列表,但您可以将 lift 任何其他纯函数注入(inject)到 IO monad 中以对其进行任意纯计算。

像这样的事情会做:

import Control.Applicative
import Data.List

l :: [(String, [String], IO Int)]
l = [("Foo", [], return 2), ("Bar", [], return 1)]

f :: Monad m => (a, b, m c) -> m (a, b, c)
f (x, y, ioz) = ioz >>= \z -> return (x, y, z)

sl = sortBy (\(x, y, z) (x', y', z') -> compare z z') <$> mapM f l

我应该提到,因为这可能并不明显,这将按照 IO Int 操作最初出现在列表中的顺序运行它们。但要对它们进行排序,您必须运行它们来获取 Int 值,并且它们必须按某种顺序运行。

关于haskell - 如何根据 IO Int 值对列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16204528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com