Я решил проблему. Но мне кажется, что это не оптимальное решение. Помогите найти более простое решение, если более простое решение существует ..
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"