2012-02-09 50 views
8

我想在Haskell中編寫一個urlview的副本。該程序讀取一條消息(通過STDIN管道),提取所有URL並要求用戶選擇其中一個。如何重置Haskell中的stdin?

看完消息後,STDIN明顯達到EOF。在Python中,我重置STDIN像這樣

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

如何在Haskell中實現相同?

回答

7

據我所知,沒有辦法在Haskell中「重新分配」內置的stdin,但你可以另外打開一個新的句柄到/dev/tty。你的Python代碼直接翻譯會是這樣的

import System.IO 

main = do 
    message <- getContents 
    tty <- openFile "/dev/tty" ReadMode 
    putStr "Which URL to open? " 
    url <- hGetLine tty 
    ... 
8

你不能在Haskell改變stdin手柄。在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 

不要忘了與調用close您的新手柄hClose

相關問題