代码之家  ›  专栏  ›  技术社区  ›  Nowhere man

如何在ghci中测试从stdin读取的程序?

  •  0
  • Nowhere man  · 技术社区  · 6 年前

    我的程序有一个错误,我想在ghci中看到:

    $ ./my-program < ./my-data
    Prelude.foldl1: empty list
    

    我试着改变 stdin getLine 但它似乎并不影响 盖特林 我的程序使用,即使之后加载:

    $ ghci
    Prelude> import System.IO
    Prelude System.IO> getLine <- fmap hGetLine $ openFile "my-data" ReadMode
    :l "my-program.hs"
    :main
    

    我是否需要重写我的所有ios以获得一个显式句柄,以便能够在ghci中测试它们?

    2 回复  |  直到 6 年前
        1
  •  3
  •   n. m. could be an AI    6 年前

    您可以尝试将程序包装成类似这样的内容(已测试的工作代码):

    import qualified System.IO
    import qualified GHC.IO.Handle
    
    filename = "/tmp/myfilename"                                                                                                                                                                                                                                                      
    
    main = do                                                                                                                                                                                                                                         
          h <- System.IO.openFile filename System.IO.ReadMode                                                                                                                                                                                         
          old_stdin <- GHC.IO.Handle.hDuplicate System.IO.stdin                                                                                                                                                                                       
          GHC.IO.Handle.hDuplicateTo h System.IO.stdin                                                                                                                                                                                                
          System.IO.hClose h
          realMain
          GHC.IO.Handle.hDuplicateTo old_stdin System.IO.stdin
    
    realMain = ...
    

    还应该可以定义一个用户定义的ghci命令来为任何ghci命令执行此操作,但我还没有尝试过。见 here 为某人的。重定向命令的ghci 标准输出 使用用户定义的 :redir 命令。

        2
  •  -1
  •   tylerweir    6 年前

    我想你想要:

    ghci> :set args YOUR_ARG
    ghci> main
    

    ghci> :main YOUR_ARG
    

    请参见这里: How to set a program's command line arguments for GHCi?