Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 使用“排序”对列表进行排序;a->;a->;也许是订购;功能_Sorting_Haskell - Fatal编程技术网

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
,那么您可以任意选择一个或另一个作为第一个。但是在这种情况下,你也可以让函数return
LT
而不是
Nothing
,并且仍然使用
sortBy
@chepner,你不能尝试这样的拓扑排序吗?您可以得出结论
x@leftaroundabout@Cirdec我认为具有及物性就足够了:即每当两个比较
x时