Как две Haskell программы могут обмениваться целочисленными значениями через stdin и stdout, не обрабатывая данные как текст? - PullRequest
5 голосов
/ 21 января 2020

Мне интересно узнать, как эффективно отправлять данные между Haskell программами, используя стандартный ввод и вывод. Предположим, я хочу передать две программы вместе: «P1» выводит число 5 в стандартный вывод, а «P2» берет целое число из стандартного ввода, добавляет 1 и снова выводит его в стандартный вывод. Прямо сейчас лучший способ, которым я знаю, состоит в том, чтобы вывести данные в виде текста из 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

Я бы хотел использовать стандартный ввод / вывод для отправки целого числа, не рассматривая его как текст, если это возможно. Я предполагаю, что это все еще требует некоторого анализа, чтобы работать, но я надеюсь, что возможно проанализировать данные как двоичные и получить более быструю программу.

Есть ли у Haskell какой-либо способ сделать это простым ? Поскольку я снова перехожу от одного базового Haskell типа данных (Int) к тому же типу со стандартным вводом-выводом в середине, мне интересно, есть ли простое решение, которое не требует написания собственного двоичного файла парсер (чего я не знаю как сделать). Кто-нибудь может предоставить такой метод?

1 Ответ

2 голосов
/ 21 января 2020

Вот код, с которым я закончил:

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)

Полученные программы могут быть передаются вместе, и результирующая программа ведет себя как требуется.

...