我如何测试从 GHCi 中的标准输入读取的程序?
How can I test a program reading from stdin in GHCi?
我的程序有一个错误,我想在 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
我是否需要重写我的所有 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。
我的程序有一个错误,我想在 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
我是否需要重写我的所有 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。