我在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
只是一个独奏播放器?
答案 0 :(得分:8)
interact
无法实现您的目标。在幕后interact
以hGetContents
为自己声称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个字符串的列表。
如果您希望允许更少的行,或者如果您想在遇到特殊情况时停止阅读,事情会变得更复杂。