哈斯克尔大师。注意向我展示一些执行此任务的haskellian方法,这些方法不受我对haskell和FP的有限知识的限制吗?
groupDups [] = []
groupDups list@(x:xs) = groupDups' x list
where groupDups' _ [] = []
groupDups' x list = let (m,r) = partition (x ==) list
in m : groupDups r
> groupDups [1,2,3,4,1,2,3,4,4,3,2,1,4,3,2,1]
[[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
答案 0 :(得分:4)
您可以sort
列表,然后group
:
> import Data.List
> (group . sort) [1,2,3,4,1,2,3,4,4,3,2,1,4,3,2,1]
[[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
答案 1 :(得分:1)
如果您想避免在类型中引入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]]
您可以通过将辅助函数累积到参数列表中来稍微提高复杂性,询问您是否对细节感兴趣。
答案 2 :(得分:0)
这样做很奇怪。
groupDups ls =
map (\(h:t) -> t) $ foldl (\s e -> map (\(h:t) -> if h == e then (e:h:t) else (h:t)) s) (nub [[x] | x <- ls]) ls
答案 3 :(得分:0)
此功能仅需Eq
groupDups xs = foldl insert [] xs
where insert [] x = [[x]]
insert (ys@(y:_):yss) x | x == y = (x:ys):yss
| otherwise = ys:(insert yss x)