Хаскелл:Распечатка содержимого списка кортежей
-
03-07-2019 - |
Вопрос
По сути, мне нужно написать функцию, которая принимает список типов [(String, String)]
и распечатывает содержимое так, что построчно результат будет выглядеть следующим образом:
FirstString : SecondString
FirstString : SecondString
..и т. д. для каждого элемента в списке.У меня есть следующий код, и он его распечатывает, но по какой-то причине выводит строку, содержащую [(),()]
в конце.
display :: Table -> IO ()
display zs = do {
xs <- sequence [putStrLn ( a ++ " = " ++ b) | (a, b) <- zs];
print xs
}
Есть ли что-то, что я делаю неправильно?
Решение
Окончательный вывод xs не нужен. Здесь последовательность возвращает набор () s (возвращаемое значение putStrLn), и print также печатает это.
Пока вы это делаете, теперь, когда print xs больше не существует, вы можете избавиться от привязки переменной xs и сделать последовательность в sequence_, чтобы отбросить возвращаемое значение, давая:
display :: Table -> IO()
display zs = sequence_ [putStrLn (a++" = "++b) | (a,b) <- zs]
Другие советы
Вы даже можете использовать mapM
:
display :: Table -> IO ()
display = mapM_ (\(a,b) -> putStrLn (a++" = "++b))
Я согласен с Я, что вам следует разделить свой код на две функции:
- А чистый часть:функция, которая принимает вашу структуру данных и превращает ее в строку
- Ан нечистый часть, которая отображает эту строку на консоли
Вот простая реализация:
showTable :: Table -> String
showTable xs = concatMap format xs
where
format (a, b) = a ++ " : " ++ b ++ "\n"
display :: Table -> IO ()
display table = putStr (showTable table)
У этой конструкции есть два преимущества:
Во-первых, большая часть вашей «логики» находится в чистой части кода, что хорошо, в стиле функционального программирования.
Во-вторых, и это всего лишь простой принцип разработки программного обеспечения;теперь у вас есть функция многократного использования, которую вы можете использовать, если когда-нибудь захотите отформатировать структуру данных в другой части вашего кода (что кажется вероятным).
Напишите функцию, которая принимает кортеж в строку, отформатированную по вашему желанию.
Затем concatMap эту функцию над вашим списком; распечатать результат.