如何在GHCi中测试从stdin读取的程序?

时间:2018-06-19 14:52:44

标签: haskell testing io interactive 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中对其进行测试?

2 个答案:

答案 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?