У меня есть программа, которая в зависимости от заданных параметров работы по-разному:Правильный способ чтения из стандартного ввода в Haskell
- Если есть 2 аргументы - это занимает 2 аргумент как имя файла, считывает из него и затем просто распечатывает его.
- Если есть один аргумент - он читается из stdin, а также распечатывает его.
Вот код:
main :: IO()
main = do
-- Read given arguments
args <- getArgs
-- If file containing gramma was given
if length args == 2 then do
hfile <- openFile (last args) ReadMode
content <- hGetContents hfile
let inGramma = getGramma content
doJob (head args) inGramma
hClose hfile
return()
-- If no file was given - reads from stdin
else if length args == 1 then do
content <- getContents
let inGramma = getGramma content
doJob (head args) inGramma
return()
else do putStrLn "Invalid count of arguments!"
Проблема заключается в том, когда он читает из стандартного ввода, после каждой новой строки (введите прессованные), она выводит эту строку и чем читает дальше. Мне нужно, чтобы он подождал весь ввод и распечатал его (после Ctrl + D).
Вот функции, используемые в этом коде:
-- | Structure of gramma
data GrammaStruct = Gramma
{ nonTerminals :: NonTerminals
, terminals :: Terminals
, start :: Start
, rules :: Rules
} deriving (Eq)
-- | Representation of gramma
instance Show GrammaStruct where
show (Gramma n t s r) =
init (showSplit n) ++
"\n" ++ init (showSplit t) ++
"\n" ++ showStart s ++
"\n" ++ init (showRules r)
-- | Print gramma
showGramma :: GrammaStruct -> IO()
showGramma gr = do
putStrLn $ show gr
-- | Transforms string given from file of stdin into gramma representation in app
getGramma :: String -> GrammaStruct
getGramma hIn = procLns (lines hIn)
-- | Depending on option given, provides required functionality
doJob :: String -> GrammaStruct -> IO()
doJob op gramma
| op == "-i" = showGramma gramma
Спасибо.
Не то, чтобы вопрос был _wrong_, как таковой, но «дождаться всего ввода и затем распечатать его» - это довольно антимодульное требование. Я не удивлюсь, если это требование исчезнет или даже станет проблемой для вас позже в разработке этого инструмента. –