如何对[MVar a]列表进行排序在排序中使用作为元素进行比较。例如:

sortList :: [MVar Int] -> [MVar Int]

我想不出一个办法不打破其他线索。
更新:
我需要对列表进行排序,因为我希望实现一个类似MVar的引用计数,并始终返回引用最少的引用类似于:
getLeastUsed :: [MVar Int] -> MVar Int
getLeastUsed = head . sortList

在线程中,我想增加“Int”。
更新:
我注意到通过回答right签名需要IO,因为MVar

最佳答案

首先,您的类型签名是不可能的;读取一个MVar不是引用透明的(这应该很明显——这就是它们的作用!)。这有两个后果:
排序函数必须返回IO操作
该列表将根据读取每个MVar时看到的值进行排序;它不仅在使用列表时可能无效,还可能在读取最后一个值之前更改一半,使第一个值过期。
前者是不可避免的,假设后者对于您的目的是可以接受的,那么您可以做@hammar演示的事情。
但是,考虑到排序很快就会过时,而且您似乎对最少的元素最感兴趣,您可能会发现这样的东西更直接有用,因为排序在其他方面几乎没有用处:

import Control.Applicative
import Data.List
import Data.Ord

leastUsed :: [MVar Int] -> IO (MVar Int)
leastUsed vars = fst . minimumBy (comparing snd) . zip vars <$> mapM readMVar vars

10-05 18:42