在Haskell中的程序之间传递数据

时间:2015-05-25 07:15:36

标签: haskell compilation tree

我在Haskell中正在做两个程序,其中一个程序提供了一个充满值的树。

另一个程序必须现在填充相同的树。我搜索过它,但我还没有找到关于如何做类似事情的事情。

例如,我执行./Generate并使用值保存树。然后我执行./Work并使用树的值。有人可以帮帮我吗?

2 个答案:

答案 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

您可以使用getContentsputStrLn来使用标准输入/输出。

完整示例:

-- 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

您可以使用竖线(bashcmd.exe,...)

$ ./producer | ./consumer
Tree with 3 nodes

答案 1 :(得分:1)

最简单的方法是:不要使用2个单独的程序。如果你真的需要2个独立的程序,那么你需要选择3件事:

  1. 将树转换为StringByteString
  2. 的方法
  3. 将字符串或字节串发送到其他程序的方法
  4. StringByteString转换回树
  5. 的方法

    对于#1和#3:使用showread可能最简单,但如果你想要定义相同的格式,你也可以定义自己的函数。

    对于#2:如果要分别运行2个程序,那么你别无选择:你必须使用一个文件。最简单的方法是使用writeFilereadFile函数。如果要同时运行2个程序,您还可以使用Network.Socket

    中的功能