【发布时间】:2016-08-04 19:39:31
【问题描述】:
我在 GHCI 中遇到此错误:
*** Exception: <stdin>: hGetLine: illegal operation (handle is semi-closed)
运行这段代码后:
main = do
interact $ unlines . fmap proccess . take x . lines
readLn :: IO Int
我很确定原因是take x。有没有更好的方法来读取only x 行输入使用交互或interact 只是一个单独的玩家?
【问题讨论】:
-
interact将标准输入置于半关闭状态。我假设您的函数第一次正常工作,之后的所有其他调用都失败了?关闭并重新打开 GHCi 或编译您的程序并执行它。 -
没错,之后每次读取
stdin都失败了。 -
附带说明,除了关闭并重新打开 ghci 之外,是否可以通过其他方式重新打开关闭的标准输入句柄?
-
正如@RowanBlush 所指出的,
stdin句柄被interact或读取整个标准输入的任何函数置于半关闭状态。请记住,您的 GHCI 会话基本上是一个大块 - 写main = getContents >> getContents同样是无效的。如果您想阅读n行,只需使用replicateM n getLine{readLn/whatever}- 使用读取所有标准输入的函数之后总是会关闭标准输入。您不能“重新打开”stdin- 它只是底层的 unix 文件描述符。