2013-03-09 20 views
8

Komut satırında bir Notational Velocity stili-find-as-tip-tipi dosya araması oluşturarak Haskell'in temellerini ele almaya çalışıyorum. Tüm sorunu çözmek yerine, bunun çok basit bir sürümünü deniyorum: 10 satırlı bir dosya ve her satırda 3 harfli bir kelime var. Yazdığım her harfin ardından, yazdığım kelimeyi içeren giriş numaralarının listesini güncelleştirmek istiyorum.Komut satırında gerçek zamanlı otomatik bulmayı gerçek zamanlı olarak uygulamak için hangi Haskell deyimlerini kullanabilirim?

Birisi bunu yapan bir Haskell programını gösterebilir mi? Benim sorunum, her karakter girdisinde yeniden değerlendirme yapmayı zorlamada yatıyor. Şimdiden milyonlarca teşekkürler.

+0

Bu, Haskell'in yetenekleri ve komut satırı yetenekleri hakkında daha azdır. Genel olarak, kodunuzun, kullanıcı [Enter] tuşuna basmadan önce komut satırında yazılanları bildiğini düşünmüyorum. –

+1

@ KarolisJuodelė Bir programın kesinlikle bunu yapabileceğini düşünüyorum - örneğin Vim, tek tuş girişlerine basılmadan müdahale eder. Bunu yapmanın yolu, terminalden bir kerede tek bir karakter okumak ve ardından, basılan tuşun içeri girip girmediğine bağlı olarak ya da bir tür kitaplık kullanıp kullanmayacağına bağlı olarak, tamamlamaları güncelleştirmek veya bazı eylemler yapmaktır. Komut satırı UI'leri yapmak için, ncurses gibi (birçok komut satırı programı için kullanılır). – DarkOtter

+0

@DarkOtter, bu yüzden "genel olarak" dedim. Platform bağımlı kütüphaneleri (ve çapraz platform sarmalayıcıları) ile yapılabileceğini biliyorum. Ancak bunların kullanımı teşvik edilmemelidir - uygun bir kullanıcı arayüzü istiyorsanız, uygun bir UI araç seti kullanın. Yeni başlayanların konsola UI'nin daha kolay olduğu fikrini alabileceğinden korkuyorum, oysa aslında daha zordur. –

cevap

1

Studing Reaktif programlama iyi bir başlangıç ​​olabilir.
Bunun için iyi bir kütüphane reactive banana
gibi görünüyor. Baz bazı example var.

Daha fazla bilgi edinmek isterseniz, FRP'de, stack numaralı telefondaki mükemmel bir konu size net bir genel bakış sağlayacaktır.

2

İstediğiniz tüm Haskell programını yazmayı denemeyeceğim, ancak şu anda üzerinde sıkıştığınızı iddia ettiğiniz bir bitin çok kısa bir örneğini görüyorsunuz: her tuşa basıldıktan sonra bir şey yapmak. Heyecan verici bir şey yapmayacağız (sadece bir numaraya çarpıp yazdırın), ancak bu küçük bir görevi nasıl yapacağınızı gösterecek ve belki de oradan hack yapmaya başlayabilirsiniz.

Gerçekten bilmeniz gereken tek şey, girişteki satır arabelleğini kapatabileceğinizdir.

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

Ben sadece bu biraz oynadı ve iki not yapacağız. 1) Muhtemelen stdout için arabelleklemeyi de kapatmak istersiniz. 2) Döngü çok yavaş ise * çok * giriş karakterleri kaçırmak kolay. Sadece char'i (putstr [toUpper c] ile) yeniden yazdırın ve klavyeyi açın ve ne demek istediğimi göreceksiniz. –

İlgili konular