簡體   English   中英

列表列表haskell

[英]lists of lists 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]]

我要串聯具有成對的第一個元素的列表。 我試過了

 map concat list 

 map (\t -> (filter (==).first) list ) list 

但是第一個不起作用,第二個給出錯誤。 有任何想法嗎?

使用Data.ListData.Function.on的幾個函數,它變成:

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

sortByFirst :: Ord a => [(a, b)] -> [(a, b)]
sortByFirst = sortBy (compare `on` fst)

groupBy函數期望對數據進行排序,因此我們必須首先按每個內部元組進行排序(即按((a, b), [x,y,z])(a, b)進行排序)

groupByFirst :: Eq a => [(a, b)] -> [[(a, b)]]
groupByFirst = groupBy ((==) `on` fst)

然后我們使用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]

您也可以將其實現為Map.insertWith的折疊

import Data.Map (elems, empty, insertWith)

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

或任何Monoid:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM