与“学习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)