我有兴趣学习如何使用标准输入和输出在 Haskell 程序之间有效地发送数据。假设我想将两个程序连接在一起:“P1”将数字 5 输出到 stdout,而“P2”从 stdin 中获取一个整数,加 1,然后再次将其输出到 stdout。现在,我所知道的最好的方法是将数据作为文本从 P1 输出,将该文本解析回 P2 中的整数,然后从那里继续。例如:
P1.hs:
module Main where
main = do
print 5
P2.hs:
module Main where
main = fmap manipulateData getLine >>= print
where
manipulateData = (+ 1) . (read :: String -> Int)
输出:
$ (stack exec p1) | (stack exec p2)
6
如果可能,我想使用标准 i/o 发送一个整数而不将其视为文本。我假设这仍然需要某种解析才能工作,但我希望可以将数据解析为二进制并获得更快的程序。
Haskell 有没有办法让这件事变得简单明了?由于我正在从一个基本的 Haskell 数据类型 (Int) 再次转换为相同类型,并在中间通过标准 i/o,我想知道是否有一个不需要编写自定义二进制解析器的简单解决方案(我不知道该怎么做)。谁能提供这样的方法?
最佳答案
这是我最终得到的代码:
module Main where
import qualified Data.ByteString.Lazy as BS
import qualified Data.Binary as B
main :: IO ()
main = do
dat <- BS.getContents
print $ (B.decode dat :: Int) + 1
另一个程序使用类似的导入和输出 5 与以下行:
BS.putStr $ B.encode (5 :: Int)
生成的程序可以通过管道连接在一起,生成的程序按要求运行。
关于parsing - 两个 Haskell 程序如何通过 stdin 和 stdout 交换整数值而不将数据视为文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59833576/