Превращение списка кортежей в список

Рейтинг: 1Ответов: 2Опубликовано: 27.10.2014

Допустим, есть список кортежей вида

[("ключ 1", "значение 1"), ("ключ 2", "значение 2")]

Нужно получить список вида

["ключ 1 = значение 1", "ключ 2 = значение 2"]

Пораскинув мозгами, придумал такую функцию

fun d = result : fun $ tail d
  where
    result = [r]
    r = fst d' ++ snd d'
    d' = head d

Понимаю, что написал полную чушь, но это общий алгоритм, каким его я вижу.
Вопросы: - как будет выглядеть программа, которая преобразует нужным образом списки? - как правильно написать мой алгоритм?

Спасибо!

Ответы

▲ 4

В Вашем решении нет ничего плохого (кроме того, что оно, вроде, не скомпилируется, но типы и сообщения компилятора помогут сделать из этого компилируемый код), но большинство функций такого вида упрощаются с использованием map:

fun = map (\ r -> fst r ++ snd r)

А функции, подобные лямбде в скобках, упрощаются с использованием uncurry:

fun = map (uncurry (++))

Изучайте стандартные функции, используйте hoogle.

Хорошее упражнение по изучению Prelude (стандартная библиотека Haskell) — переписать её самому без подглядывания только по типам. Могу порекомендовать домашние задания из этого курса по функциональному программированию.


P.S. На всякий случай: функции в следующем примере эквиваленты:

f' xs = map g xs
f'' = map g
f''' = \ xs -> map g xs
▲ 2

Ваша постановка задачи прямо-таки дословно транслируется в код с использованием паттерн-матчинга (сопоставления с образцом):

mapToList :: [(a,b)] -> [String]
mapToList []          = []
mapToList ((x,y):xys) = (show x ++ " = " ++ show y) : mapToList xys