如何在第二个组件中将[(char,Int)]
转换为Int的字符串,给出第一个组件中字符的重复次数?例如,输入[(a,9),(b,10)]
应该将["aaaaaaaaa","bbbbbbbbbb"]
作为输出。
答案 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只有a
和b
先前已定义,才有意义没有提到。
在这种情况下,您可以使用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"]
但它不符合规格,因为它在答案中包含了引号。 ;)
我的观点是,您需要围绕Char
和String
文字引用。