通用排序函数的最通用可能/有意义的签名

时间:2015-10-24 13:41:46

标签: sorting haskell generic-list

我已经做了相当多的谷歌搜索来提出一些提示/示例,到目前为止无济于事。

实现排序算法的方法是否比基于列表的方法更通用?我可以选择sortGeneric :: IsList l => l a -> l a,但这似乎是一个坏主意,因为IsList只不过是对OverloadedLists的支持。

也许我应该只是询问有关排序Traversable t => t a

的问题

2 个答案:

答案 0 :(得分:5)

您当然可以通过折叠它来生成列表,向量或堆,然后使用TraversablemapAccumL将所有元素放回来对任意mapAccumR进行排序。麻烦的是,这可能不如直接对容器进行分类。

import qualified Data.PQueue.Min as Q
import Data.Foldable (toList)
import Data.Traversable (Traversable (..))
import Data.Tuple (swap)
import Control.Monad.Trans.State.Strict

sort xs = mapAccumL' go (Q.fromList . toList $ xs) xs where
  go h _ = swap $ Q.deleteFindMin h

mapAccumL' :: Traversable t =>
              (a -> b -> (a, c)) -> a -> t b -> t c
mapAccumL' f s t = flip evalState s $
   traverse (\q -> state $ swap . flip f q) t

请注意,toListfromList的使用纯粹是为了方便,所涉及的列表很可能永远不会被实际分配。

答案 1 :(得分:0)

怎么样

sortGeneric :: (Ord a, Traversable t) => t a -> t a