获取元组列表的第一个元素

Tyl*_*Joe 1 haskell tuples list replicate

我有这个元组列表

[(4,'a'), (1,'b'), (2,'c'), (2,'a'), (1,'d'), (4,'e')]
Run Code Online (Sandbox Code Playgroud)

我想得到每个元组的第一个元素,然后复制它以做出以下内容:"aaaabccaadeeee"

我想出了这个代码,但它只给了我第一个元组的复制品.

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

我正在考虑使用map来获取每个元组的复制,但我没有成功.

小智 6

既然您已经知道如何为单个元素找到正确的答案,那么您只需要一点递归

func :: [(Int, a)] -> [a]
func [] = []
func ((n, elem):rest) = (replicate n elem) ++ (func rest)
Run Code Online (Sandbox Code Playgroud)

映射值也应该有效.您只需将结果字符串连接成一个.

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

或者,如果您熟悉currying:

func :: [(Int, a)] -> [a]
func xs = concat $ map (uncurry replicate) xs
Run Code Online (Sandbox Code Playgroud)

最后,如果您习惯使用函数组合,则定义将变为:

func :: [(Int, a)] -> [a]
func = concat . map (uncurry replicate)
Run Code Online (Sandbox Code Playgroud)

使用concatmap如此常见,有一个功能就是这样做.是的concatMap.

func :: [(Int, a)] -> [a]
func = concatMap (uncurry replicate)
Run Code Online (Sandbox Code Playgroud)