2014-01-18 54 views
3
isPermutation :: (Ord a) => [a] -> [a] -> Bool 
isPermutation x y = sort x == sort y 

isPermutation "123" "312" -> True 
isPermutation "123" "111" -> False 

groupBy isPermutation ["123","3","321"] -> ["123","3","321"] <- What I get 

groupBy isPermutation ["123","3","321"] -> [["123","321"],"3"] <- What I would want 

是否有一个函数将列表中的项目共享相同的属性?groupBy没有做我期望的,我在找什么?

+0

我认为你必须在这个模型中使用'isPermutation“123”“321” - > True'来获得正确的结果 –

回答

6

groupBy只有组连续共享相同属性的元素例如

> groupBy (==) [1,2,1,1,2] 
[[1],[2],[1,1],[2]] 

要组合所有需要首先对列表进行排序的元素。

> groupBy isPermutation . sortBy (comparing sort) $ ["123","3","321"] 
[["123","321"],["3"]] 

comparingData.Ord进口)

+0

啊,简单的解决方案就像Haskell中的allways一样。谢谢! –

1

你想要的是一个多路分区。利用Data.Map.insertWith

Prelude Data.List Data.Map> Data.List.map (reverse.snd) $ toList $ 
    foldl (\mp s-> insertWith (++) (sort s) [s] mp) empty ["123", "3", "321"] 
[["123","321"],["3"]] 

这样每个元素进行排序只有一次。

相反,使用排序解决方案的decorate-sort-undecorate习语。

相关问题