如何在Haskell中编写一个函数,它采用a1a2a3格式的输入字符串并扩展为a1a2a2a3a3a3。例如,输入字符串“code”将扩展为“coodddeeee”
答案 0 :(得分:19)
所以你希望nth
字符重复n
次。
f :: String -> String
f x = concatMap g (zip x [1..])
where
g (x,y) = replicate y x
我确信有一种更简单的方法可以做到这一点。
说明:首先我们得到字符串并将其与列表中的位置配对(从1开始)。这就是zip的作用:
Prelude> zip "code" [1..]
[('c',1),('o',2),('d',3),('e',4)]
现在函数g (x,y)
使用复制函数,它复制你想要的任何y次。所以我们复制x,y次。
Prelude> g ('z',4)
"zzzz"
如果我们将这个函数映射到生成的列表上,你会得到结果:
Prelude> map g $ zip "code" [1..]
["c","oo","ddd","eeee"]
如果您有一个字符串列表,可以使用concat
将它们连接在一起。 concatMap
将函数g
应用于每对字母和数字,然后将字符串连接到最终结果中。
Prelude> concat $ map g $ zip "code" [1..]
"coodddeeee"
基本上:concat $ map g
- > concatMap g
编辑:现在它可以工作,也可以在一行中完成:
f x = concatMap (\(a,b)->replicate b a ) $ zip x [1..]
输出:
Prelude> f "lambda"
"laammmbbbbdddddaaaaaa"
答案 1 :(得分:15)
import Control.Monad
f = zip [1..] >=> uncurry replicate
产量
Main> f "code"
"coodddeeee"
答案 2 :(得分:9)
可能非常低效:)
f :: Int -> [Char] -> [Char]
f _ [] = []
f n (c:s) = (replicate n c) ++ (f (n+1) s)
g :: [Char] -> [Char]
g s = f 1 s
*Main> g "code"
"coodddeeee"
答案 3 :(得分:4)
为什么人们讨厌列表理解?
Prelude> let f s = concat [ replicate x y | (x,y) <- zip [1..] s]
Prelude> f "code"
"coodddeeee"
或者如果你想疯狂扩展
Prelude> :set -XParallelListComp
Prelude> let f s = concat [ replicate x y | x <- [1..] | y <- s]
Prelude> f "code"
"coodddeeee"
答案 4 :(得分:1)
Prelude> let l = "code" in concat $ [take y $ repeat (last $ take y l) | y <- [1..length l]]
"coodddeeee"