根据IO流的内容获取IO

Getting IO based on the contents of an IO stream

我有一种情况,我试图连接两个文本文件 A 和 B 的内容。复杂的是 B 的位置在 A 的内容中指定。我创建了一个函数(最小下面的示例),它读取 A,打开 B,然后尝试将它们粘在一起,但坦率地说,这种方法似乎太简单了,而且我觉得它可能不是最好的方法。它编译但我无法测试它,因为它找不到第二个文件(大概与路径有关,但我还没有弄清楚是什么)。任何建议表示赞赏。

getIOFromIO :: IO String -> IO String
getIOFromIO orig = do
     origContents <- orig
     moreIO <- readFile origContents
     return (origContents ++ " " ++ moreIO)

函数 getIOFromIO 应该可以正常工作,只要您向它传递一个读取第一个文件的 IO 操作,例如:

getIOFromIO (readFile "foo.tmp")

并提供 foo.tmp 的全部内容,包括任何前面或结尾的空格(如结尾的换行符)都是所需文件名的一部分。

以下 self-contained 示例演示了它的用法:

setup :: String -> String -> IO ()
setup file1 file2 = do
  writeFile file1 file2 -- put name of file2 in file1
  writeFile file2 $ "body\n"

-- unmodified from your question
getIOFromIO :: IO String -> IO String
getIOFromIO orig = do
  origContents <- orig
  moreIO <- readFile origContents
  return (origContents ++ " " ++ moreIO)

main = do
  setup "foo.tmp" "bar.tmp"
  txt <- getIOFromIO (readFile "foo.tmp")
  print txt

它应该生成输出:

"bar.tmp body\n"
 ^^^^^^^ ^^^^
       |    ` contents of second file (bar.tmp)
       |
        `- contents of first file (foo.tmp)