Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中的程序之间传递数据_Haskell_Compilation_Tree - Fatal编程技术网

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

在Haskell中的程序之间传递数据,haskell,compilation,tree,Haskell,Compilation,Tree,我在Haskell中做了两个程序,其中一个提供了一个充满值的树 另一个程序现在必须填充相同的树。我搜索了一下,但还没有找到如何做类似的事情 例如,我执行./Generate并用值保存树。然后我执行./Work,它与树的值一起工作。谁能帮帮我吗?最简单的方法可能是 data MyData = ... deriving (Read, Show) 制作人 makeMyData :: MyData makeMyData = .... main = writeFile "output.data" (s

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

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


例如,我执行./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发送到其他程序的一种方法
  • 字符串
    ByteString
    转换回树的一种方法
  • 对于#1和#3:使用
    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