2016-08-07 113 views
0

從Windows正在添加,我最近安裝了一個名爲薄荷Linux發行版和Haskell平臺通過慶典(GHC 7.10),但必須有一些錯誤ghci的標準輸入在ghci的原因是:閱讀標準輸入被打破

interact $ take 0 拋出一個錯誤,但 interact $ take 1 沒有。

此外,如果我使用backspacearrows或寫入標準輸入時的任何其它控制按鈕,它進入炭符號。例如退格進入^?到ghci中而不是刪除的最後一個字符鍵入...

[email protected] ~ $ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> interact $ take 0 
Prelude> 
<stdin>: hGetChar: illegal operation (handle is closed) 
[email protected] ~ $ ghci 
GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help 
Prelude> readLn :: IO String 
euoe^?^?^[[1;5C^[[D^[[B -- here I tried to delete 'euoe' 
+0

你是如何運行該程序?你還期望發生什麼? GHCI似乎執行任何管道傳輸,所以我不確定你是否可以重新讀取標準輸入。 – pdexter

+2

這看起來與你的問題有關:http://stackoverflow.com/questions/38776023/handle-is-semi-closed-error-in-haskell – villou24

+3

'interact'和GHCi混合不好,IIRC。 'interact'需要所有stdin,而GHCi無法恢復。 – chi

回答

3

關於控制碼的文字,這是因爲你已經成功地逃避所有的在線編輯(readline,Haskeline)通常會解釋您的按鍵。

我不知道的細節,但調用GHCI是像啓動子shell與bash --noediting。這使GHCi能夠接收原始按鍵,而不受readline庫的干擾。這是因爲Haskeline — GHCi用來代替readline —的配置可以更容易地使用可用函數的選項卡完成(您知道GHCi提供選項卡完成,對不對?)。

調用從GHCI getLine然後有效地通過一個陷阱門下降和後直接前往標準輸入完全閃Haskeline。畢竟,只有一個標準輸入。您現在可以直接輸入未緩衝的終端。

再回到你首先關注的,那裏只有一個標準輸入也是爲什麼GHCI打印Prelude>提示後立即得站不住。 interact(在幕後使用hGetContents)聲稱它會將所有將通過句柄(stdin)輸入的輸入作爲一個大懶惰String。實際上,interact還沒有聲稱處理的句柄上沒有剩餘的輸入,因此句柄立即放入「半封閉的」狀態。它沒有關閉(仍然可能有更多的輸入,將作爲懶惰的一部分讀取String得到!)關閉任何新來者,否則輸入會得到重複(interactgetLine的句柄的新讀者會得到相同的線!)。

回到GHCi,使用interact後,標準輸出仍然正常,提示符照常打印,然後GHCi依靠Haskeline返回一行處理。 Haskeline(作爲行編輯器)調用阻止getChar(iirc)來添加一個字符到行或者執行一些行編輯命令並因爲它處理半閉合句柄而死亡。這樣一個弱小的生物就會掉下來,生命的重要輪胎就會滾落下來。

+0

謝謝,控制代碼文字真的很痛苦,因爲我不能做任何錯字... Windows ghci以某種方式設法解釋他們,所以我很困惑,爲什麼linux ghci不能。 –