我正在测试一个程序,具体来说,我正在测试一项孤立的功能。它需要一个既能读又能写的句柄。问题是,仅使用"stdin"或"stdout"无法完成工作。我不想因为这样一个测试而重写我的代码,也不想仅仅为了进行测试就打开一个套接字。此外,该程序尚不可用(有些函数未定义),所以我不能通过运行它来进行测试。
在Haskell中,从"stdin"获取输入并从"stdout"输出的句柄是什么?
在Haskell中,从"stdin"获取输入并从"stdout"输出的句柄是什么?
一个简单的方法是使用Pipe
来抽象出对句柄的读写操作。可以使用的一种类型是:
example :: Monad m => Pipe String String m ()
original :: IO ()
original = do
str1 <- getLine
str2 <- getLine
putStrLn (str1 ++ str2)
pipes
版本将如下所示:import Pipes
example :: Monad m => Pipe String String m ()
example = do
str1 <- await
str2 <- await
yield (str1 ++ str2)
>>> import qualified Pipes.Prelude as Pipes
>>> Pipes.toList (each ["Hello, ", "world!"] >-> example)
["Hello, world!"]
...或者您可以使用实际输入和输出进行测试:
>>> runEffect $ Pipes.stdinLn >-> example >-> Pipes.stdoutLn
Hello, <Enter>
world!<Enter>
Hello, world!
这样可以让你保持主要逻辑的纯净性,然后选择是否以纯粹或不纯粹的方式运行它。
Data.Knob
实例,如果我需要进行“纯”测试。 - Jon Purdy