处理是Haskell中的半封闭错误?

时间:2016-08-04 19:39:31

标签: haskell io handle

我在GHCI中收到此错误:

*** Exception: <stdin>: hGetLine: illegal operation (handle is semi-closed)

运行此代码后:

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

我很确定原因是take x。有没有更好的方法来阅读 x行输入使用交互 interact只是一个独奏播放器?

2 个答案:

答案 0 :(得分:8)

interact无法实现您的目标。在幕后interacthGetContents为自己声称stdin的全部内容。这会使句柄处于“半封闭”状态,阻止您在关闭它之后尝试与句柄进行任何进一步的交互,因为它的整个输入已被消耗(懒惰)。

尝试使用 -

读取有限数量的行
import Control.Monad (replicateM)

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

答案 1 :(得分:2)

概念上interact使用标准输入的所有。因此,之后调用readLn没有任何意义。

要仅读取给定数量的行,请使用以下内容:

import Control.Monad

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

此处input将是(完全)10个字符串的列表。

如果您希望允许更少的行,或者如果您想在遇到特殊情况时停止阅读,事情会变得更复杂。