2014-01-14 6 views
14

나는 이해하지 못한 것을 우연히 발견했습니다. GHCi와 getLine의 차이점과 runhaskell의 차이점

은 내가

module Main where 

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

파일 및 runhaskell으로 스크립트를 실행하고 입력 하스켈에서 같은를 작성하는 경우 나는

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

에 따라 얻을 GHCi를 사용하고 getLine를 사용하고있는 경우 백 스페이스는 't'를 예상대로 삭제합니다.

왜 다른 점이 있습니까?

답변

20

이것은 GHCi와 GHC의 버퍼링 동작이 다르기 때문입니다. GHCi는 기본적으로 NoBuffering을 사용하는 stdin (표준 입력 스트림)을 가지고 있으며, GHC 컴파일 바이너리/runhaskell은 기본적으로 LineBuffering을 사용합니다. 명시 적으로 수행하면 Haskell 프로그램에서

hSetBuffering stdin NoBuffering 

을 수행하면 GHCi 동작을 재현 할 수 있습니다. 당신이 GHCi에

hSetBuffering stdin LineBuffering 

을 할 경우, 당신은 원치 않는 부작용을 많이해야하지만, runhaskell 동작을 재현 할 수 있습니다.

+1

내가 원하지 않는 부작용이 많다거나 ghci를 원치 않는 사람이거나 컴파일 된 버전에 대해 어떤 종류의 보호 기능이있는 것일까?이 부분에 대해 좀 더 자세히 설명 할 수 있습니까? – epsilonhalbe

+0

당신은 할 수 있건 없건간에 - 나는 가능한 한 빨리이 대답을 받아 들일 것입니다! – epsilonhalbe

+2

그들은 GHCi에서 원하지 않습니다. GHCi 자체가 입력을 읽는 방식을 망칠 것입니다. 따라서 GHCi를 실행하기 위해 입력 할 때 Return 키를 누르기 만하면 GHCi가 표시됩니다. – kosmikus