我的程序有一个我想在GHCi中看到的错误:
$ ./my-program < ./my-data
Prelude.foldl1: empty list
我尝试在GHCi中更改stdin
或getLine
,但即使后来加载,它似乎也不会影响程序使用的getLine
:
$ ghci
Prelude> import System.IO
Prelude System.IO> getLine <- fmap hGetLine $ openFile "my-data" ReadMode
:l "my-program.hs"
:main
我是否需要重写我的所有IO以使用显式句柄才能在GHCi中对其进行测试?
答案 0 :(得分:2)
您可以尝试将程序包装成如下所示(经过测试的有效代码):
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 。
答案 1 :(得分:-1)
我想你想要
ghci> :set args YOUR_ARG
ghci> main
或
ghci> :main YOUR_ARG
参见此处:How to set a program's command line arguments for GHCi?