Buffer io padrão do Haskell

Ontem escrevi um pequeno exercício para meus alunos: fazer um programa de eco reverso.

Para aprender algo novo, tentei implementar uma solução Haskell. O trivialmain = forever $ interact reverse não funciona. Eu atravesseiessa questão e fez uma versão corrigida:

import Control.Monad
import System.IO

main = forever $ interact revLines

revLines = unlines . map (reverse) . lines 

Mas esta versão corrigida também não funciona. Eu li odocumentação de buffer e jogou com as várias configurações. Se eu definirNoBuffering ouLineBufferingmeu programa funciona corretamente. Finalmente eu imprimi os modos de buffer padrão para stdin e stdout

import System.IO

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

eu tenhoBlockBuffering Nothing se eu rodar meu programa do xinetd (echo "test" | nc localhost 7mas do cli eu tenhoLineBuffering

Qual é a diferença entre um serviço xinetd tcp e um programa cli em relação ao buffering?Eu tenho que definir manualmente o buffer se eu quiser escrever um programa de trabalho com ambos os métodos em execução?

Editar: Obrigado a todos pelas respostas úteis.

Eu aceito a resposta que foi dada pela chama, ele me dá uma dica com isatty (3). Passei novamente pela documentação do System.IO e encontrei ohIsTerminalDevice função, com a qual posso verificar a conexão do cabo.

Para o registro, aqui está o meu programa final:

{-# OPTIONS_GHC -W #-}

import System.IO

main = do
  hSetBuffering stdin LineBuffering
  hSetBuffering stdout LineBuffering

  interact revLines

revLines = unlines . map (reverse) . lines 

questionAnswers(2)

yourAnswerToTheQuestion