簡體   English   中英

獲取元組列表的第一個元素

[英]Get the first elements of a list of tuples

我有這個元組列表

[(4,'a'), (1,'b'), (2,'c'), (2,'a'), (1,'d'), (4,'e')]

我想獲取每個元組的第一個元素,然后復制它以進行以下操作:“ aaaabccaadeeee”

我想出了這段代碼,但是只給了我第一個元組的副本。

replicate  (fst ( head [(4,'a'), (1,'b')])) ( snd ( head [(4,'a'), (1,'b')]))
--output is: "aaaa"

我當時想使用map來獲取每個元組的副本,但是我沒有成功。

由於您已經知道如何為單個元素找到正確的答案,因此您只需要進行一點遞歸

func :: [(Int, a)] -> [a]
func [] = []
func ((n, elem):rest) = (replicate n elem) ++ (func rest)

映射值也應該起作用。 您只需要將結果字符串連接成一個即可。

func :: [(Int, a)] -> [a]
func xs = concat $ map func2 xs where 
              func2 (n, elem) = replicate n elem

或者,如果您熟悉currying

func :: [(Int, a)] -> [a]
func xs = concat $ map (uncurry replicate) xs

最后,如果您習慣使用函數組合,則定義將變為:

func :: [(Int, a)] -> [a]
func = concat . map (uncurry replicate)

使用concatmap很常見,有一個功能可以做到這一點。 它是concatMap

func :: [(Int, a)] -> [a]
func = concatMap (uncurry replicate)

您對嘗試使用map是正確的。 但是首先讓我們看看為什么您的代碼不起作用

replicate  (fst ( head [(4,'a'), (1,'b')])) ( snd ( head [(4,'a'), (1,'b')]))

您要復制的第一個參數是列表的開頭(4,'a')。 然后,您在此上調用fst,因此第一個參數為4。第二個參數發生相同的事情,您得到“ a”。 您看到的結果。

在使用map之前,請嘗試使用遞歸操作。 您想采用列表的一個元素並將復制應用於它,然后將其與對第二個元素應用復制的結果結合起來。

generate [] = []    
generate (x:xs) = replicate (fst x) (snd x) ++ generate xs

請注意,我正在使用模式匹配來獲取列表的第一個元素。 您可以使用模式匹配將元素也獲取到元組中,然后就不需要使用fst / snd函數。 還要注意,我正在使用模式匹配來定義空列表的基本情況。

generate [] = []
generate ((x,y):xs) = replicate x y ++ generate xs

現在進入地圖,因此地圖會將您的功能應用於列表的每個元素,這是第一次嘗試

generate (x,y) = replicate x y
map generate  xs

以上結果與遞歸略有不同。 考慮一下,map將對每個元素應用generate並將結果存儲在列表中。 generate創建一個列表。 因此,當您應用地圖時,您將創建一個列表列表。 您可以根據需要使用concat對其進行展平,這將為您提供與遞歸相同的結果。

最后,如果可以使用遞歸,那么也可以使用fold。 Fold只會對列表的每個元素應用一個函數,然后返回累積的結果(廣義上來說)。

--first parameter is the function to apply, second is the accumulator, third is your list
foldr step [] xs
   where step (x,y) acc = 
                   (replicate x y) ++ acc

再次在這里,我在功能步驟中使用了模式匹配,以提取出元組的元素。

ls = [(4,'a'), (1,'b'), (2,'c'), (2,'a'), (1,'d'), (4,'e')] 

concat [replicate i x | (i, x) <- ls]

會給

"aaaabccaadeeee"

無積分版

concat . map (uncurry replicate) 

暫無
暫無

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

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