List 列表列表haskell

List 列表列表haskell,list,haskell,List,Haskell,我有一个简单的问题,我是Haskell的新手,正在努力学习很多东西。 例如,如何连接 [( (0,1) , [1,2,3]) , ((1,2) , [7,8,9]) ,((0,1) , [4,5,6]) ] to [[1,2,3,4,5,6] , [7,8,9]] 我想连接第一个元素相等的列表。 我试过了 但是第一个不起作用,第二个给出了一个错误。 有什么想法吗?使用Data.List和Data.Function中的两个函数。在上,这变成: import Data.List (sor

我有一个简单的问题,我是Haskell的新手,正在努力学习很多东西。 例如,如何连接

 [( (0,1) , [1,2,3]) , ((1,2) , [7,8,9]) ,((0,1) , [4,5,6]) ] to [[1,2,3,4,5,6] , [7,8,9]]
我想连接第一个元素相等的列表。 我试过了

但是第一个不起作用,第二个给出了一个错误。
有什么想法吗?

使用
Data.List
Data.Function中的两个函数。在
上,这变成:

import Data.List     (sortBy, groupBy)
import Data.Function (on)

sortByFirst :: Ord a => [(a, b)] -> [(a, b)]
sortByFirst = sortBy (compare `on` fst)
groupBy
函数期望数据被排序,因此我们必须首先按每个内部元组进行排序(即按
中的
(a,b)
((a,b),[x,y,z])

然后我们使用
groupBy
将结果元组列表分组到元组列表中,其中每个内部列表共享相同的第一个元素

squishByFirst :: (Eq a, Ord a) => [(a, b)] -> [[b]]
squishByFirst = (map . concatMap) snd . groupByFirst . sortByFirst
然后我们在
snd
上使用一些奇特的映射,滚动到每个内部列表中,拉出第二个元素(列表),将它们组合在一起,并返回结果。这相当于:

squishByFirst xs =
  let grouped = groupByFirst . sortByFirst $ xs
  in  [concat [ys | (_, ys) <- g] | g <- grouped]
或对于任何幺半群:

squishByFirst :: (Ord k, Monoid vs) => [(k, vs)] -> [vs]
squishByFirst = elems . mkMap
  where
  mkMap = foldr (uncurry (insertWith mappend)) empty

你在正确的轨道上。你看过吗?回答得好。我认为
map(concatMap snd)
(map.concatMap)snd
更清晰。听起来很挑剔,但这让我有点迟钝。@JordanMackie这是Haskell常用的一个成语<代码>f(gx)==(f.g)x
squishByFirst xs =
  let grouped = groupByFirst . sortByFirst $ xs
  in  [concat [ys | (_, ys) <- g] | g <- grouped]
import Data.Map (elems, empty, insertWith)

squishByFirst :: Ord k => [(k, [v])] -> [[v]]
squishByFirst = elems . mkMap
  where
  mkMap = foldr (uncurry (insertWith (++))) empty
squishByFirst :: (Ord k, Monoid vs) => [(k, vs)] -> [vs]
squishByFirst = elems . mkMap
  where
  mkMap = foldr (uncurry (insertWith mappend)) empty