我的程序有一个我想在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 中测试它们?
您可以尝试将程序包装成这样的东西(经过测试的工作代码(:
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 命令执行此操作,但我还没有尝试过。请参阅此处了解某人的 .ghci,该 .ghci 使用用户定义的:redir
命令重定向命令的stdout。
我想你想要:
ghci> :set args YOUR_ARG
ghci> main
或
ghci> :main YOUR_ARG
请参阅此处: 如何为 GHCi 设置程序的命令行参数?