问题中的术语general(与 special 相反)意味着该函数可以对项目进行排序,只要它们属于 的实例类型Ord
。
考虑一下最著名的 haskell 广告之一
quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
上面的实现不是就地的。
我试图写一个就地版本。就地进行快速排序很容易。通常,我们只需要一个可变数组,我选择了Foreign.Marshal.Array
.
我的实现是就地的并且运行得很好,但我对它的类型签名不满意
(Ord a, Storable a) => [a] -> IO [a]
更准确地说,类型约束Storable a
让我很恼火。
显然,如果我们要对项目进行排序,Ord
则需要约束,而Storable
没有必要。
相比之下,经典快速排序或sort
in的类型签名Data.List
是Ord a => [a] -> [a]
. 约束是Ord
.
我没有找到摆脱额外约束的方法。
我搜索了 Stackoverflow,发现了一些关于在 Haskell 中就地快速排序的问题,例如
,你如何在 Haskell 中进行就地快速排序
为什么极简主义,例如 Haskell 快速排序不是“真正的”快速排序?
不幸的是,他们的主要关注点就位。那里给出的所有就地快速排序示例也有额外的类型约束。
例如,iqsort
klapaucius 给出的 具有类型签名
iqsort :: (Vector v a, Ord a) => v a -> v a
有谁知道如何使用类型签名实现就地快速排序 haskell 函数Ord a => [a] -> [a]
?
我知道如何进行就地快速排序,但我不知道如何使其通用。