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

时间:2011-03-06 12:48:05

标签: haskell

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

4 个答案:

答案 0 :(得分:5)

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

map (uncurry $ flip replicate)

答案 1 :(得分:3)

这可以从前奏中的一些功能组合而成。由于您的输入是元组列表,因此返回值将成为字符串列表。

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

Prelude> map repChars [('a',9),('b',10)]
["aaaaaaaaa","bbbbbbbbbb"]

或者如果你想把它作为一个无点的单线:

repCharList = map (uncurry (flip replicate))

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

这个滑稽可怕的答案:

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"]

但它不符合规格,因为它在答案中包含了引号。 ;)

我的观点是,您需要围绕CharString文字引用。