Хаскелл:Распечатка содержимого списка кортежей

StackOverflow https://stackoverflow.com/questions/822979

  •  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 эту функцию над вашим списком; распечатать результат.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top