两个 Haskell 程序如何通过 stdin 和 stdout 交换整数值而不将数据视为文本?

Kev*_*ner 5 parsing stdin haskell stdout

我有兴趣学习如何使用标准输入和输出在 Haskell 程序之间有效地发送数据。假设我想将两个程序连接在一起:“P1”将数字 5 输出到标准输出,“P2”从标准输入中获取一个整数,加 1,然后再次将其输出到标准输出。现在,我所知道的最好的方法是将数据作为文本从 P1 输出,将该文本解析回 P2 中的整数,然后从那里继续。例如:

P1.hs:

module Main where

main = do
  print 5
Run Code Online (Sandbox Code Playgroud)

P2.hs:

module Main where

main = fmap manipulateData getLine >>= print
  where
    manipulateData = (+ 1) . (read :: String -> Int)
Run Code Online (Sandbox Code Playgroud)

输出:

$ (stack exec p1) | (stack exec p2)
6
Run Code Online (Sandbox Code Playgroud)

如果可能,我想使用标准 i/o 发送一个整数而不将其视为文本。我假设这仍然需要某种解析才能工作,但我希望可以将数据解析为二进制并获得更快的程序。

Haskell 有没有办法让这件事变得简单明了?由于我正在从一个基本的 Haskell 数据类型 (Int) 再次转换为相同类型,并在中间通过标准 i/o,我想知道是否有一个不需要编写自定义二进制解析器的简单解决方案(我不知道该怎么做)。谁能提供这样的方法?