Haskell. Нужна функция "комплементар", которая принимает список с расширенным представлением в соответствии с правилами - PullRequest
0 голосов
/ 27 мая 2020

Реализуйте функцию «комплиментар», которая принимает на вход список с расширенным содержимым по правилам и сжимает его представление по правилам:

complimentar [Single 'c',Multiple 'v' 2,Multiple 'c' 2,Single 'f']
--"cvvccf"

Я начал решать проблему с реализацией тип данных:

data CompData = Multiple Char Int | Single Char deriving (Show)

Как решить эту проблему дальше, не понимаю. Помогите найти решение.

1 Ответ

0 голосов
/ 27 мая 2020

Я решил проблему. Но мне кажется, что это не оптимальное решение. Помогите найти более простое решение, если более простое решение существует ..

1) Реализую требуемый тип данных.

data CompData = Multiple Char Int | Single Char deriving (Show)

2) Реализую вспомогательную функцию для преобразования используемого типа CompData к стандартному типу.

convert :: CompData -> (String, Int)    
convert (Multiple x y) = ([x], y) 
convert (Single x) = ([x], 1)

3) Я реализую вспомогательную функцию для умножения строки на число.

umn :: String -> Int -> String
umn s 1 = s
umn s 0 = ""
umn s x = s ++ (umn s (x - 1))  

4) Я реализую вспомогательную функцию для сложения выражения введите CompData в строку.

umnlist :: CompData -> String
umnlist (Multiple x y) = umn (fst (convert (Multiple x y))) (snd (convert (Multiple x y)))
umnlist (Single x) = umn (fst (convert (Single x))) (snd (convert (Single x)))

5) Реализую функцию "комплиментар".

complimentar :: [CompData] -> String
complimentar [] = ""
complimentar (x : []) = umnlist x
complimentar (x : xs) = umnlist x ++ complimentar xs


Input: complimentar [Single 'c',Multiple 'v' 2,Multiple 'c' 2,Multiple 'f' 1]
Output: "cvvccf"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...