Если вы хотите избежать введения ограничения Ord
в типе, вы можете использовать это:
import Data.List
groupDups [] = []
groupDups (x:xs) = (x : group) : groupDups xs' where
(group,xs') = partition (==x) xs
Это соответственно медленнее, чем (group . sort)
, и группы упорядочены по первому появлению в исходном списке:
*Main> groupDups [1,3,2,3,4,1,2,3,4,4,3,2,1,4,3,2,1]
[[1,1,1,1],[3,3,3,3,3],[2,2,2,2],[4,4,4,4]]
Возможно, вы сможете немного улучшить сложность, сделав вспомогательную функцию, которая накапливается в списке параметров, спросите, заинтересованы ли вы в деталях.