我在Haskell中正在做两个程序,其中一个程序提供了一个充满值的树。
另一个程序必须现在填充相同的树。我搜索过它,但我还没有找到关于如何做类似事情的事情。
例如,我执行./Generate并使用值保存树。然后我执行./Work并使用树的值。有人可以帮帮我吗?
答案 0 :(得分:5)
最简单的方法可能是
data MyData = ... deriving (Read, Show)
生产者
makeMyData :: MyData
makeMyData = ....
main = writeFile "output.data" (show makeMyData)
消费者
ioUseMyData :: MyData -> IO ()
ioUseMyData myData = ....
main = readFile "output.data" >>= ioUseMyData . read
您可以使用getContents
和putStrLn
来使用标准输入/输出。
完整示例:
-- probably as module
data Tree = Node { value :: Int
, left :: Tree
, right :: Tree
}
| Empty
deriving (Read, Show)
-- your producer program
producerProgram = do
let makeTree = Node 3 (Node 5 Empty Empty) (Node 7 Empty Empty)
writeFile "output.data" (show makeTree)
-- your consumer program
consumerProgram = do
let ioUseTree t = do
let countNodes Empty = 0
countNodes (Node _ l r) = 1 + countNodes l + countNodes r
putStrLn $ "Tree with " ++ show (countNodes t) ++ " nodes"
readFile "output.data" >>= ioUseTree . read
-- simulate call both
main = do
-- produce
producerProgram
-- consume
consumerProgram
结果
Tree with 3 nodes
替换
writeFile "output.data" (show makeTree)
通过
print makeTree
和
readFile "output.data" >>= ioUseTree . read
通过
getContents >>= ioUseTree . read
您可以使用竖线(bash
,cmd.exe
,...)
$ ./producer | ./consumer
Tree with 3 nodes
答案 1 :(得分:1)
最简单的方法是:不要使用2个单独的程序。如果你真的需要2个独立的程序,那么你需要选择3件事:
String
或ByteString
String
或ByteString
转换回树对于#1和#3:使用show
和read
可能最简单,但如果你想要定义相同的格式,你也可以定义自己的函数。
对于#2:如果要分别运行2个程序,那么你别无选择:你必须使用一个文件。最简单的方法是使用writeFile
和readFile
函数。如果要同时运行2个程序,您还可以使用Network.Socket