Разница в функциональности getLine с GHCi и runhaskell

Я только что наткнулся на вещь, которую я не понимаю.

Если я использую GHCi и использую getLine Я получаю следующее

Prelude> a <- getLine
Test<Backspace>oo<CR> -- the Backspace action results in a '^?'
Prelude> a
"Test\DELoo"

Если я напишу то же самое в файле на Haskell

module Main where

main :: IO ()
main = do a <- getLine
          putStrLn a

и запустите сценарий с помощью runhaskell и введите тот же ввод, Backspace удаляет 't', как и ожидалось.

Почему есть разница?

1 ответ

Решение

Это связано с разным поведением буферизации в GHCi и GHC. GHCi имеет стандартный ввод потока, используя NoBuffering по умолчанию, и GHC-скомпилированные двоичные файлы / runhaskell использование LineBuffering по умолчанию. Если вы явно делаете

hSetBuffering stdin NoBuffering

в вашей программе на Haskell вы сможете воспроизвести поведение GHCi. Если вы делаете

hSetBuffering stdin LineBuffering

в GHCi у вас будет много нежелательных побочных эффектов, но вы сможете воспроизвести runhaskell поведение.

Другие вопросы по тегам