在Haskell中的程序之间传递数据
我在Haskell中做了两个程序,其中一个提供了一个充满值的树 另一个程序现在必须填充相同的树。我搜索了一下,但还没有找到如何做类似的事情在Haskell中的程序之间传递数据,haskell,compilation,tree,Haskell,Compilation,Tree,我在Haskell中做了两个程序,其中一个提供了一个充满值的树 另一个程序现在必须填充相同的树。我搜索了一下,但还没有找到如何做类似的事情 例如,我执行./Generate并用值保存树。然后我执行./Work,它与树的值一起工作。谁能帮帮我吗?最简单的方法可能是 data MyData = ... deriving (Read, Show) 制作人 makeMyData :: MyData makeMyData = .... main = writeFile "output.data" (s
例如,我执行./Generate并用值保存树。然后我执行./Work,它与树的值一起工作。谁能帮帮我吗?最简单的方法可能是
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)
借
及
借
您可以使用管道(bash
,cmd.exe
,…)
最简单的方法是:不要使用两个单独的程序。如果你真的需要两个独立的程序,那么你需要选择三件事:
字符串
或ByteString
字符串
或ByteString
转换回树的一种方法show
和read
可能是最简单的,但如果需要,也可以定义自己的函数,只要它们定义的格式相同
对于#2:如果这两个程序是分开运行的,那么你别无选择:你必须使用一个文件。最简单的方法是使用
writeFile
和readFile
函数。如果这两个程序要同时运行,您也可以使用#2中的功能。。。别无选择。真正地文件显然是最简单的,但还有其他选择,套接字,共享内存等…如果两个程序分开运行,当第二个程序运行时,第一个程序拥有的所有套接字和内存将不可用。杰里米说,如果程序同时运行,你可以使用Network.Socket
。当然@AlexeyShmalko你是对的,但我已经尝试过最简单的方法。一步一步;)
print makeTree
readFile "output.data" >>= ioUseTree . read
getContents >>= ioUseTree . read
$ ./producer | ./consumer
Tree with 3 nodes