【问题标题】:How can I read mutiple lines from stdin within GHCI more than once?如何在 GHCI 中多次从标准输入读取多行?
【发布时间】:2019-05-20 11:10:54
【问题描述】:

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

【问题讨论】:

  • 据我所知。您所要求的内容非常奇怪(因为我从未见过程序以这种方式运行)以至于它实际上并不适合标准库。许多较旧的命令行应用程序在一行上使用单个 . 作为多行文本终止符,因此如果您真的愿意,可以这样做
  • @Cubic 显然这并不奇怪,因为“为更大的利益学习你的 Haskell”网站显示了示例(不起作用),并且考虑到您仍然需要为多行输入 :{ 等在 ghci 中输入,而不是简单地输入直到CTRL-D。与此同时,我在 github 上查看了getContents 的来源,发现它映射到了primGetContents。知道在哪里可以找到源代码吗?
  • 我认为这是一个有效的问题,只是遇到了同样的问题。在 python 命令行上,调用 sys.stdin.read() 就可以了。我认为问题在于 GHCI 用 EOT 代替 EOF,这可能是为了解决 getContents 半关闭 EOF 上的句柄,比较 stackoverflow.com/questions/12119420/…

标签: haskell


【解决方案1】:

这是我正在寻找的功能:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多