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
无法实现您想要执行的操作。在幕后,interact
和 hGetContents
声称拥有整个 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 个字符串的列表。
如果您希望减少行数或遇到特殊情况时想停止阅读,事情会变得更加复杂。
我在 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
无法实现您想要执行的操作。在幕后,interact
和 hGetContents
声称拥有整个 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 个字符串的列表。
如果您希望减少行数或遇到特殊情况时想停止阅读,事情会变得更加复杂。