与“学习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,但在这种情况下不是我想要的。

最佳答案

这是我正在寻找的功能:

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

08-17 07:44