Sorting 使用“排序”对列表进行排序;a->;a->;也许是订购;功能
有没有一种变体Sorting 使用“排序”对列表进行排序;a->;a->;也许是订购;功能,sorting,haskell,Sorting,Haskell,有没有一种变体 sortBy :: (a -> a -> Ordering) -> [a] -> [a] (在Data.List中)允许我使用a->a->Maybe Ordering排序功能,而不是a->a->Ordering 此变体的作用是: sortBy' :: (a -> a -> Maybe Ordering) -> [a] -> Maybe [a] 如果排序过程中调用a->a->Maybe Ordering时返回Nothing,sor
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
(在Data.List中)允许我使用a->a->Maybe Ordering
排序功能,而不是a->a->Ordering
此变体的作用是:
sortBy' :: (a -> a -> Maybe Ordering) -> [a] -> Maybe [a]
如果排序过程中调用a->a->Maybe Ordering
时返回Nothing
,sortBy'
将返回Nothing
。否则,它将返回包装在中的排序列表,只返回
如果这种变体还没有,你能帮我构建一个吗?(最好是至少与排序同样有效的排序)您可以调整快速排序:
quickSortBy :: (a -> a -> Maybe Ordering) -> [a] -> Maybe [a]
quickSortBy f [] = Just []
quickSortBy f (x:xs) = do
comparisons <- fmap (zip xs) $ mapM (f x) xs
sortLesser <- quickSortBy f . map fst $ filter ((`elem` [GT, EQ]) . snd) comparisons
sortUpper <- quickSortBy f . map fst $ filter ((== LT) . snd) comparisons
return $ sortLesser ++ [x] ++ sortUpper
quickSortBy::(a->a->Maybe Ordering)->[a]->Maybe[a]
quickSortBy f[]=Just[]
快速排序f(x:xs)=do
我认为这不是个好主意。结果是否为Nothing
将取决于进行了哪些比较,以及进行了哪些比较将取决于使用了哪种排序算法。要检查所有可能的比较是否都是,只需就需要O(n^2)个时间。我认为,如果您向我们描述您试图通过此实现的目标,这将是有益的。为什么不事先确保将有效数据传递给sortBy
?是否考虑了一个用例?如果您这样做,我们可能会提供更好的帮助。我可以想象使用这样一个函数进行拓扑排序,如果返回值为Nothing
,那么您可以任意选择一个或另一个作为第一个。但是在这种情况下,你也可以让函数returnLT
而不是Nothing
,并且仍然使用sortBy
@chepner,你不能尝试这样的拓扑排序吗?您可以得出结论x@leftaroundabout@Cirdec我认为具有及物性就足够了:即每当两个比较x时