代码之家  ›  专栏  ›  技术社区  ›  Ford O.

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

  •  5
  • Ford O.  · 技术社区  · 8 年前

    我在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 只是个独奏者?

    2 回复  |  直到 8 年前
        1
  •  8
  •   R B    8 年前

    你想做的不可能 interact .幕后 互动 声称全部 stdin 为了自己 hGetContents 。这会将句柄置于“半关闭”状态,防止您尝试除关闭外与句柄进行任何其他交互,因为它的全部输入已经被占用(延迟)。

    尝试用-

    import Control.Monad (replicateM)
    
    getLines :: Int -> IO [String]
    getLines n = replicateM n getLine
    
        2
  •  2
  •   ErikR    8 年前

    从概念上讲 interact 消耗 全部的 标准输入。所以打电话来没有任何意义 readLn 之后

    要只读取给定数量的行,请使用类似以下内容:

    import Control.Monad
    
    main = do input <- replicateM 10 getLine
              ...
    

    在这里 input 将是(精确地)10个字符串的列表。

    如果你想少读几行,或者当你遇到特殊情况时想停止阅读,事情就会变得更加复杂。