我在GHCI中遇到了以下错误:
*** Exception: <stdin>: hGetLine: illegal operation (handle is semi-closed)
这是在运行以下代码之后出现的:
main = do
interact $ unlines . fmap proccess . take x . lines
readLn :: IO Int
我相信问题的原因是take x
。使用interact
读取仅 x 行输入是否有更好的方法,还是interact
只能单打独斗?
interact
将标准输入置于半关闭状态。我假设您的函数第一次运行时已经正确执行,但之后的每次调用都失败了?请关闭并重新打开 GHCi 或编译您的程序并执行它。 - R Bstdin
的读取之后都失败了。 - Ford O.stdin
句柄会被interact
或任何读取整个stdin
的函数置于半关闭状态。请记住,您的GHCI会话基本上是一个大的do块 - 编写main = getContents >> getContents
同样无效。如果您想要读取n
行,请使用replicateM n getLine{readLn/whatever}
- 使用一个读取所有stdin
的函数将始终在之后关闭stdin
。您无法“重新打开”stdin
- 它只是底层的Unix文件描述符。 - user2407038