是否有
的变体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
将返回Just
。否则它将返回包含在sortBy
中的排序列表。
如果还没有这样的变体,你能帮我构建一个吗? (最好是至少和window.parent.$(window.parent.document).trigger('HIDE_QUOTE_EDIT', {sender: 'quote-edit'});
一样有效的。)
答案 0 :(得分:2)
您可以调整quickSort:
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
至少假设您的排序谓词f :: a -> a -> Maybe Ordering
是反对称的:{{1}}当且仅当f x y == Just LT
时。然后当f y x == Just GT
返回quickSortBy f
时,我认为您有此保证:对于[1..n-1]中的所有i,Just [x1,...,xn]
为f xi x(i+1)
或{{1} }。
当特别是f是偏序(传递)时,则[x1,...,xn]是完全有序的。