Domyślne buforowanie io Haskell

Wczoraj napisałem małe ćwiczenie xinetd dla moich uczniów: stwórz program odwrotnego echa.

Aby dowiedzieć się czegoś nowego, próbowałem zaimplementować rozwiązanie Haskell. To banalnemain = forever $ interact reverse nie działa. Przeszedłemto pytanie i wprowadziłem poprawioną wersję:

import Control.Monad
import System.IO

main = forever $ interact revLines

revLines = unlines . map (reverse) . lines 

Ale ta poprawiona wersja również nie działa. Czytambuforowanie dokumentacji i grał z różnymi ustawieniami. Jeśli ustawięNoBuffering lubLineBuffering, mój program działa poprawnie. Wreszcie wydrukowałem domyślne tryby buforowania dla standardowego i standardowego wyjścia

import System.IO

main = do 
  hGetBuffering stdin >>= print 
  hGetBuffering stdout >>= print

MamBlockBuffering Nothing jeśli uruchomię program z xinetd (echo "test" | nc localhost 7) ale od cli mamLineBuffering

Jaka jest różnica między usługą xinetd tcp a programem cli, jeśli chodzi o buforowanie?Czy muszę ręcznie ustawić buforowanie, jeśli chcę napisać program działający przy użyciu obu metod?

Edytować: Dziękuję wszystkim za pomocne odpowiedzi.

Przyjmuję odpowiedź, która została podana przez ogień, daje mi wskazówkę z isatty (3). Przejrzałem ponownie dokumentację System.IO i znalazłemhIsTerminalDevice funkcja, dzięki której mogę sprawdzić połączenie uchwytu.

Dla porządku, oto mój ostatni program:

{-# OPTIONS_GHC -W #-}

import System.IO

main = do
  hSetBuffering stdin LineBuffering
  hSetBuffering stdout LineBuffering

  interact revLines

revLines = unlines . map (reverse) . lines 

questionAnswers(2)

yourAnswerToTheQuestion