2016-08-04 3 views
4

나는 GHCI에서이 오류를 얻고있다핸들이 Haskell에서 반 폐쇄 된 오류입니까? 이 코드를 실행 한 후</p> <p><code>*** Exception: <stdin>: hGetLine: illegal operation (handle is semi-closed)</code></p> <p>을 :

main = do 
    interact $ unlines . fmap proccess . take x . lines 
    readLn :: IO Int 

그리고 나는 원인이 take x입니다 확신합니다. x 행만 입력하여 읽을 수있는 방법이 있습니까 또는interact 솔로 플레이어입니까?

+0

'interact'는 stdin을 반 폐쇄 상태로 만듭니다. 귀하의 함수가 처음 제대로 작동했다고 가정하고 그 후에 다른 모든 호출이 실패했다고 생각합니까? GHCi를 닫았다가 다시 열거 나 프로그램을 컴파일하고 실행하십시오. –

+0

정확히, 'stdin'의 모든 읽기가 실패했습니다. –

+0

참고로 ghci를 닫았다가 다시 열어 다른 방법으로 stdin에 대한 닫힌 핸들을 다시 열 수 있습니까? –

답변

8

interact으로는 수행 할 수 없습니다. 뒤에서는 interact가 과 함께 stdin의 전체를 주장합니다. 그러면 “ semi-closed ” 상태로 핸들이 놓이기 때문에 핸들을 닫을뿐만 아니라 입력 전체가 이미 사용되었으므로 (지연적으로) 핸들을 더 이상 사용하지 못하도록합니다. 개념적으로 interact 표준 입력의 모든을 소비

는 —

import Control.Monad (replicateM) 

getLines :: Int -> IO [String] 
getLines n = replicateM n getLine 
2

과 라인의 유한 수를 읽어보십시오. 나중에 readLn에 전화하는 것은 말이되지 않습니다. (정확히) 10 문자열의 목록이 될 것입니다 여기에

import Control.Monad 

main = do input <- replicateM 10 getLine 
      ... 

input :

만 라인의 주어진 숫자를 읽으려면 같은 것을 사용합니다.

줄을 줄이거 나 특수 조건이 발생했을 때 읽기를 중지하려면 상황이 더 복잡해집니다.