Haskell:组合元组列表中的整数
Haskell: Combine integers in a list of tuples
我需要从这里出发:
[(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
到这里:
[([1, 2], "a"), ([1], "b"), ([1], "c"), ([2], "dd")]
到目前为止我有
combineInts listTuple = someFunc (map (\(num, str) -> ([num], str)) listTuple)
其中 "someFunc" 是我仍然需要弄清楚并实施的部分。我相信它应该利用 foldr、map、and/or intercalate 来实现我的目标。有什么想法吗?
如果您先订购列表,则可以使用 groupBy
执行此操作:
import Data.List (groupBy)
import Data.Ord (comparing)
import Data.Function (on)
map (\l@((_,c):_) -> (map fst l, c)) $ groupBy (on (==) snd) $ sortBy (comparing snd) inputList
应该这样做:
import Data.Function (on)
import Data.List (groupBy, sort, sortBy)
out = map f . groupBy ((==) `on` snd) . sortBy (compare `on` snd) $ input
where input = [(2,"a"),(1,"a"),(1,"b"),(1,"c"),(2,"dd")]
f xs@(x:_) = (sort $ map fst xs, snd x)
main = print out
我需要从这里出发:
[(2,"a"), (1,"a"), (1,"b"), (1,"c"), (2,"dd")]
到这里:
[([1, 2], "a"), ([1], "b"), ([1], "c"), ([2], "dd")]
到目前为止我有
combineInts listTuple = someFunc (map (\(num, str) -> ([num], str)) listTuple)
其中 "someFunc" 是我仍然需要弄清楚并实施的部分。我相信它应该利用 foldr、map、and/or intercalate 来实现我的目标。有什么想法吗?
如果您先订购列表,则可以使用 groupBy
执行此操作:
import Data.List (groupBy)
import Data.Ord (comparing)
import Data.Function (on)
map (\l@((_,c):_) -> (map fst l, c)) $ groupBy (on (==) snd) $ sortBy (comparing snd) inputList
应该这样做:
import Data.Function (on)
import Data.List (groupBy, sort, sortBy)
out = map f . groupBy ((==) `on` snd) . sortBy (compare `on` snd) $ input
where input = [(2,"a"),(1,"a"),(1,"b"),(1,"c"),(2,"dd")]
f xs@(x:_) = (sort $ map fst xs, snd x)
main = print out