如何将字符串推入从 Haskell 中的另一个函数调用的 IO 输入?

How do I push a string into IO input being called from another function in Haskell?

我有一个类似于 (or) 的函数,如果用户输入为 true 或 Bool 为 True,则接收 Bool 和 returns True。

我无法更改 orFunc 的任何内容。它必须保持原样

orFunc :: Bool -> IO Bool
orFunc xs = do ys <- getLine
               let rev1 = xs || (read ys::Bool)
               return rev1

so.. (orFunc False) 用户输入 True 会 return True.

现在假设,我想用一系列自动输入来测试这个功能。

函数测试器调用我们的 orFunc,并希望将位于 false.txt 文件中的单词“False”推送到 orFunc 中。这样,我就不需要每次都在函数中输入“False”这个词。它会自动从 false.txt 中抓取它。当 orFunc 不将输入作为参数时,我该怎么做?

这是它应该是什么样子的例子。这不起作用,但这是我尝试过的方法。

tester :: IO Bool -> IO Bool
tester xs = do ys <- readFile "false.txt"
               xs <- ys
               return xs

这是我运行对其进行一些测试的方式。

{--This will return True because True || False = True --}
tester (orFunc True)

{--This will return False because False || False = False --}
tester (orFunc False) 

我最好的建议是不要。相反,将 orFunc 抽象为执行 IO 的部分和执行业务逻辑的部分,并独立于 IO.

测试业务逻辑

但是,如果您已完全确定,执行此操作的一种方法是打开您的文件并将其文件描述符复制到标准输入。像这样:

import System.IO
import System.Posix.IO

main = do
    fd <- openFile "false.txt" ReadMode >>= handleToFd
    dupTo fd stdInput
    orFunc False

这仅适用于 Linux-alikes。 Windows 可能在某处有类似的 API,但我对它不够熟悉,无法给出有关位置的好指示。