gpt4 book ai didi

haskell - 如何在 Haskell 中重置标准输入?

转载 作者:行者123 更新时间:2023-12-04 05:41:44 25 4
gpt4 key购买 nike

我正在尝试在 Haskell 中编写一个 urlview 克隆。该程序读取一条消息(通过 STDIN 传输),提取所有 URL 并要求用户选择其中一个。

读完消息后,STDIN 显然达到了 EOF。在 Python 中,我像这样重置 STDIN

message = sys.stdin.read()
sys.stdin = open('/dev/tty')
selected_index = raw_input('Which URL to open? ')

我将如何在 Haskell 中实现相同的目标?

最佳答案

您无法更改 stdin在 Haskell 中处理。在 Python 中,sys.stdin变量只指向一个句柄,所以当你用新的文件句柄替换它时,旧的 stdin句柄仍然存在,但 sys.stdin变量现在包含文件句柄。

由于 System.IO.stdin 句柄在 Haskell 中是不可变的(就像许多其他变量一样,或者我应该说值),你不能在 Haskell 中做同样的事情。

你可以做的是打开/dev/tty带有新句柄的文件,并使用该句柄从终端读取。您可以在任何句柄上使用所有相同的操作,就像在 stdin 上一样。 .只需导入 System.IO , 并且每次你会使用 foo ...要获得一些输入,请改用 hFoo handle ... .例如,要从终端读取一行,请使用以下代码:

import System.IO

-- ...
newstdin <- openFile "/dev/tty" ReadMode
-- Instead of normal getLine; just prepend "h" and pass the handle
line <- hGetLine newstdin

不要忘记通过调用 hClose 来关闭您的新句柄!

关于haskell - 如何在 Haskell 中重置标准输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9211734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com