Haskell 如何将(Char,Int)列表转换为具有给定重复字符数的字符串?

Haskell 如何将(Char,Int)列表转换为具有给定重复字符数的字符串?,haskell,Haskell,如何将[(char,Int)]转换为第二个组件中的Int字符串,给出第一个组件中字符的重复次数?例如,输入[(a,9),(b,10)]应将[“aaaaaaaaa”,“bbbbbbbbbb”]作为输出 Hugs> map (\(c,n) -> replicate n c) [('a',9), ('b',10)] ["aaaaaaaaa","bbbbbbbbbb"] 或 我假设输入应该是[('a',9),('b',10)],因为没有's,只有a和b之前定义过,才有意义,您没有提到 在这

如何将
[(char,Int)]
转换为第二个组件中的Int字符串,给出第一个组件中字符的重复次数?例如,输入
[(a,9),(b,10)]
应将
[“aaaaaaaaa”,“bbbbbbbbbb”]
作为输出

Hugs> map (\(c,n) -> replicate n c) [('a',9), ('b',10)]
["aaaaaaaaa","bbbbbbbbbb"]


我假设输入应该是
[('a',9),('b',10)]
,因为没有
'
s,只有
a
b
之前定义过,才有意义,您没有提到


在这种情况下,您可以使用
replicate
创建一个包含给定次数的给定元素的列表(请注意,字符串
“aaaaaaaa”
是一个包含元素
'a'
9次的列表)。要对列表中的每个元组执行此操作,可以在列表上使用
map
。现在您有了一个包含每个字符的字符串的列表。要将其转换为用逗号分隔的单个字符串,可以使用
插入
,它使用分隔符和列表列表并返回单个li。

这可以通过序言中的几个函数组合而成。因为您的输入是元组列表,所以返回值变成字符串列表

repChars :: (Char, Int) -> String
repChars (c,n) = replicate n c

Prelude> map repChars [('a',9),('b',10)]
["aaaaaaaaa","bbbbbbbbbb"]
或者,如果您想将其作为一个无点的一行程序:

repCharList = map (uncurry (flip replicate))

这是家庭作业吗?如果是这样,请使用家庭作业标签。

有趣而可怕的答案:

Prelude> let replignore ((_,x):[]) = [replicate x 'b']; replignore ((_,x):xs) = replicate x 'a' : replignore xs
Prelude> replignore [(a,9),(b,10)]
<interactive>:1:13: Not in scope: `a'
<interactive>:1:19: Not in scope: `b'
Prelude> let a = undefined
Prelude> let b = undefined
Prelude> replignore [(a,9),(b,10)]
["aaaaaaaaa","bbbbbbbbbb"]
Prelude>let replignore((x,x):[])=[replicate x'b'];replignore((x,x):xs)=复制x'a”:replignore xs
前奏曲>回复忽略[(a,9),(b,10)]
:1:13:不在范围内:`a'
:1:19:不在范围内:`b'
前奏曲>让a=未定义
前奏曲>让b=未定义
前奏曲>回复忽略[(a,9),(b,10)]
[“aaaaaaa”,“bbbbbbbb”]
但它不太符合规格,因为它在答案中包含引号


我的意思是,你的
Char
String
文本需要引号。

我想你的意思是
replicate
,而不是
repeat
。@John:是的,我知道。谢谢。不客气。你经常纠正我;希望有一天我能收支平衡。如果你想把
map
替换成
concatMap
,就可以了。
Prelude> let replignore ((_,x):[]) = [replicate x 'b']; replignore ((_,x):xs) = replicate x 'a' : replignore xs
Prelude> replignore [(a,9),(b,10)]
<interactive>:1:13: Not in scope: `a'
<interactive>:1:19: Not in scope: `b'
Prelude> let a = undefined
Prelude> let b = undefined
Prelude> replignore [(a,9),(b,10)]
["aaaaaaaaa","bbbbbbbbbb"]