【问题标题】:Haskell - putStrLn multiple calls not printingHaskell - putStrLn 多个调用不打印
【发布时间】:2016-09-09 14:36:46
【问题描述】:

嗨,我有这个运行解析器的主要方法,

main = do
  args <- getArgs
  let filename = head args
  contents <- readFile filename
  let c = parse parseProgram contents
  putStrLn "------------------------------------------------"
  putStrLn "THE PROGRAM WE HAVE PARSED"
  putStrLn "------------------------------------------------"
  putStrLn (show ((fst.head) c))
  return ()

当我运行这个程序时,对 putStrLn 的前三个调用不会打印到终端,它只显示已解析的程序。

任何帮助将不胜感激,我如何获得所有打印电话?

【问题讨论】:

  • 你的命令行缓冲了吗?
  • 不过,未能刷新流不应丢弃未刷新的输出。
  • 我们无法尝试重现这一点,因为我们不知道 parse parseProgram 是什么。
  • @Zubair 您是否一直滚动到提示符?请注意,您的跟踪消息不会出现在横幅之前,而是直接出现在解析结果之前或与它混合在一起。
  • 这就是为什么一个可重复的问题是必不可少的。根本问题是你对parseProgram 的定义(我认为那是痕迹出现的地方)。

标签: haskell printing io


【解决方案1】:

这似乎是不可能的。我创建了一个更简单的示例,尽可能接近您的代码。我使用 Parsec 是因为我不确定您使用的是什么解析库。

parsec-trivial.hs的内容:

#!/usr/bin/env stack
{- stack
    --resolver lts-6.15
    --install-ghc
    runghc
    --package parsec
-}

import System.Environment
import Text.ParserCombinators.Parsec
import Text.ParserCombinators.Parsec.Char

ws = many space

nat :: Parser Integer
nat = read <$> many digit

parseProgram = ws *> nat <* ws <* eof

main = do
  args <- getArgs
  let filename = head args
  contents <- readFile filename
  let c = parse parseProgram filename contents
  putStrLn "------------------------------------------------"
  putStrLn "THE PROGRAM WE HAVE PARSED"
  putStrLn "------------------------------------------------"
  putStrLn $ show c

foo.b的内容:

42

执行这个程序是这样的:

$ ./parsec-trivial.hs foo.b
------------------------------------------------
THE PROGRAM WE HAVE PARSED
------------------------------------------------
Right 42

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 2013-10-17
    相关资源
    最近更新 更多