Haskell 中的句柄是半封闭错误?

Handle is semi-closed error in Haskell?

我在 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 lines of input using interact or is interact just a solo player?

interact 无法实现您想要执行的操作。在幕后,interacthGetContents 声称拥有整个 stdin。这会将句柄置于“半关闭”状态,防止您尝试与句柄进行任何进一步的交互,除了关闭它,因为它的全部输入已经(懒惰地)消耗了。

尝试阅读有限数量的行——

import Control.Monad (replicateM)

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

概念上 interact 消耗 all 标准输入。所以之后调用 readLn 没有任何意义。

要只读取给定的行数,请使用类似的东西:

import Control.Monad

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

此处 input 将是一个(正好)10 个字符串的列表。

如果您希望减少行数或遇到特殊情况时想停止阅读,事情会变得更加复杂。