Разница в функциональности 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
поведение.