根据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)
我有一种情况,我试图连接两个文本文件 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)