Изучение Haskell: вопрос об Обработке строк

Как я могу записать функцию в Haskell, который берет входную строку в формате a1a2a3 и расширяется в a1a2a2a3a3a3. Например, входная строка "код" была бы расширена в "coodddeeee"

5
задан BM. 24 January 2010 в 11:33
поделиться

3 ответа

Вероятно, очень неэффективно :)

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"
9
ответ дан 18 December 2019 в 05:14
поделиться

Так что вы хотите повторить 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"
19
ответ дан 18 December 2019 в 05:14
поделиться
import Control.Monad
f = zip [1..] >=> uncurry replicate

дает

Main> f "code"
"coodddeeee"
15
ответ дан 18 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: