Как я могу записать функцию в Haskell, который берет входную строку в формате a1a2a3 и расширяется в a1a2a2a3a3a3. Например, входная строка "код" была бы расширена в "coodddeeee"
Вероятно, очень неэффективно :)
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"
Так что вы хотите повторить NTH
N
Times.
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)
использует функцию реплицирования, которая повторяет все, что вы хотите. Итак, мы повторяем X, Y Times.
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"
import Control.Monad
f = zip [1..] >=> uncurry replicate
дает
Main> f "code"
"coodddeeee"