使用“a - > a - > Maybe Ordering”功能对列表进行排序

时间:2016-10-14 23:00:18

标签: 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时返回sortBy'Nothing将返回Just。否则它将返回包含在sortBy中的排序列表。

如果还没有这样的变体,你能帮我构建一个吗? (最好是至少和window.parent.$(window.parent.document).trigger('HIDE_QUOTE_EDIT', {sender: 'quote-edit'}); 一样有效的。)

1 个答案:

答案 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]是完全有序的。