我如何测试从 GHCi 中的标准输入读取的程序?

How can I test a program reading from stdin in GHCi?

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

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

我尝试在 GHCi 中更改 stdingetLine,但它似乎不会影响我的程序使用的 getLine,即使我之后加载也是如此:

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

我是否需要重写我的所有 IOs 以采用显式句柄以便能够在 GHCi 中测试它们?

我想你想要:

ghci> :set args YOUR_ARG
ghci> main

或者

ghci> :main YOUR_ARG

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

您可以尝试用这样的方式包装您的程序(已测试,有效代码):

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 命令重定向命令的 stdout