質問の一般的な(特殊化された とは対照的に)という用語は、関数が のインスタンスであるタイプである限り、アイテムをソートできることを意味しますOrd
。
最も有名な Haskell 広告の 1 つを考えてみましょう
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 のインプレース クイックソートに関するいくつかの質問を見つけまし
た
。
残念ながら、彼らの主な関心事はただの場所にあります。そこにあるすべてのインプレース クイックソートの例には、追加の型制約もあります。
たとえば、iqsort
klapaucius によって指定され た型シグネチャは次のとおりです。
iqsort :: (Vector v a, Ord a) => v a -> v a
タイプ signature でインプレース クイックソート haskell 関数を実装する方法を知っている人はいますOrd a => [a] -> [a]
か? インプレース クイックソートを作成する方法は知っていますが、一般
化する方法はわかりません。