学习Haskell:字符串操作问题

时间:2010-01-24 11:33:53

标签: string haskell

如何在Haskell中编写一个函数,它采用a1a2a3格式的输入字符串并扩展为a1a2a2a3a3a3。例如,输入字符串“code”将扩展为“coodddeeee”

5 个答案:

答案 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"