如何在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

我是否需要重写所有 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 设置程序的命令行参数?

最新更新