Задать вопрос

Как сделать красивый вывод в Haskell?

Здравствуйте. Делаю задание по Haskell. Вот код
{-# OPTIONS_GHC -Wall #-}
module Main where
import System.IO()
import System.Environment

main :: IO ()
main = do args <- getArgs 
          if (length args > 0) then do
            f <- readFile $ head args
            putStrLn $ seqWord f
          else do
            f <- getContents
            putStrLn $ seqWord f

seqWord :: String -> String
seqWord [] = []
seqWord s = show $ unlines (map (unwords . filterWord . words) (lines s))

filterWord :: [String] -> [String]
filterWord [] = []
filterWord (x:xs) = x : filterWord (filter(/=x) xs)


Программа принимает на вход или имя файла и считывает его или текст stdin. Суть программы удалить уже встречавшиеся слова в строчке. Программа работает, но есть проблемы с выводом. Если вывести так:
seqWord s = show $ unlines (map (unwords . filterWord . words) (lines s))

то виведется что, то такое
"\"111111 1 11\"\n\"5555 5 55\"\n"
Если вывести так
seqWord s = unlines (map (unwords . filterWord . words) (lines s))

то в случаи с фалом, результат будет такой
1 12 5 8 13 145 85
546 822 1 12 58 8 9
444 4 44

Но если вводить вручную через консоль, то при нажатии на Enter будет сразу выводится результат, но он должен вывестись после Ctrl C.
Может кто знает как исправить эту проблему. Спасибо
  • Вопрос задан
  • 201 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
wiz
@wiz
Ортодоксальный хаскелит
Show не занимается выводом, а только преобразует одно значение в другое. Выводом занимаются putStrLn и товарищи. Они на вход требуют [Char] или String. Если у вас уже есть значение типа [Char], то `show` на него делать не надо.

Если на руках есть список строк, то надо смотреть в чём собственно задача. Если строки надо выводить одну за другой, без переносов, то можно их склеить через `unwords`. Полученную строку можно сразу отгружать в `putStrLn`. Если надо вывести несколько строк одну за другой, то можно либо склеить их через `unlines` и вывести за один `putStrLn`, либо сделать вызвать putStrln на каждую строку из списка в отдельности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы