如何从GHCI中的stdin中多次读取多行?

时间:2019-05-20 11:10:54

标签: haskell

与“学习haskell”中的信息相反,在我的Windows系统上,ghci将CTRL-D转换为EOT,而不是EOF

因此,当我执行以下操作时:

input <- getContents
doSomething input

,其中doSomething是使用输入的函数。
这样做,我必须按CTRL-Z来结束输入文本,这是有道理的,因为getContents用于过程管道...

但是,如果我第二次重复上述步骤,则会失败,因为stdin已关闭。

因此,在浏览System.IO时,我找不到getContents的替代方案,它将对EOT做出反应。

我是否必须自己编写这样的函数,或者可以在另一个软件包中找到它?

顺便说一句,我使用的GHCI版本是8.2.2
另外,我不希望单行处理。我知道getLine,但这不是我想要的。

1 个答案:

答案 0 :(得分:1)

这是我想要的功能:

getContentsEOT :: IO String
getContentsEOT = 
    getChar >>= \c -> 
        if c == '\EOT' 
            then return "" 
            else getContentsEOT >>= \s -> 
                return (c:s)