2013-03-09 54 views
8

我試圖通過在命令行上創建一個Notational Velocity風格的find-as-you-type文件搜索來獲得Haskell的基礎知識。 而不是解決整個問題,我正在嘗試一個非常基本的版本: 存在一個文件,每行有10行和3個字母的單詞。在輸入每個字母后,我想根據我的輸入更新顯示可能包含正在輸入的單詞的行號列表。哪些Haskell成語可以用來在命令行中實現實時查找類型自動完成功能?

有人可以演示一個Haskell程序嗎?我認爲我的問題在於強制對每個字符輸入進行重新評估。多謝提前一百萬。

+0

這不是關於Haskell的功能和更多關於命令行功能的內容。一般來說,我不認爲你的代碼可以在用戶按下[Enter]之前知道命令行中寫的是什麼。 – 2013-03-09 11:03:30

+1

@KarolisJuodelė我認爲一個程序肯定可以做到這一點 - 例如Vim響應單鍵輸入而不需要按下按鍵。 要做到這一點的方法是從終端一次讀取一個字符,然後更新完成或執行一些操作,具體取決於按下的鍵是否輸入,或者可能使用某種類型的庫用於製作命令行用戶界面,如ncurses(用於許多命令行程序)。 – DarkOtter 2013-03-09 11:14:05

+0

@DarkOtter,這就是爲什麼我說「一般」。我知道它可以通過平臺依賴庫(和它們的跨平臺包裝)完成。我認爲他們的使用不應該受到鼓勵 - 如果你想要一個合適的用戶界面,請使用適當的用戶界面工具箱。我擔心初學者可能會認爲控制檯UI更簡單,而事實上,它通常更難。 – 2013-03-09 11:59:54

回答

1

學習反應式編程可能是一個很好的開始。
對於這個好的圖書館似乎是reactive banana
有一些基地example

如果您想了解更多關於FRP的信息,stack的優秀主題將給您一個清晰的概述。

2

我不會嘗試寫出你所要求的整個Haskell程序,但這裏是一個很短的例子,顯示了你現在堅持的那一點:在每次按鍵之後做一些事情。我們不會做任何令人興奮的事情(只是碰到一個數字並將其打印出來),但它會顯示如何完成這項小任務,並且您可能會從那裏開始黑客攻擊。

你真的需要知道的你唯一不知道的地方是你可以關閉輸入緩衝行。

import System.IO 

loop n = do 
    c <- getChar 
    print n 
    -- do whatever recalculation you need to do here, using 
    -- n (which can be more complicated than an Integer, as 
    -- it is here, of course) and c (which is a Char 
    -- representing the key the user whacked) 
    -- our recalculation is just to increase n by one 
    loop (n+1) 

main = do 
    hSetBuffering stdin NoBuffering -- do this once before anything else 
    loop 0 
+0

我只是玩了一下,我會做兩個筆記。 1)你可能也想關閉標準輸出緩衝。 2)如果循環太慢,很容易錯過輸入字符。只需用(putstr [toUpper c])重新打印字符,並在鍵盤上敲擊,你會明白我的意思。 – 2013-03-10 09:52:29

相關問題