2012-01-23 42 views
5

Neden bu kodun neden sadece bir kez döneceğini ve neden çıktığını anlamıyorum? Ghci'de sadece ilk döngüye cevap verebilirim, o zaman değişken kontrolu yanlış olarak ayarlanmış gibi görünüyor ve cevap verme isteğim yok.StateT ile Döngü: Bu döngü neden dönmez?

sonucudur:

*Main> testLoop1 td10 
test 
Do you want to continue? (y/N) 
y 
we continue 
test 
Do you want to continue? (y/N) 
We stop 

kodu:

type TDeckSTIO = StateT TableDecks IO 

continue = do 
putStrLn "Do you want to continue? (y/N)" 
c <- getChar 
return $ c == 'y' 


loop1 :: TDeckSTIO() 
loop1 = do 
    liftIO $ putStrLn "test" 
    cont<- liftIO continue 
    if cont 
    then do 
     liftIO $ putStrLn "we continue" 
     liftIO $ testLoop1 td 

    else liftIO $ putStrLn "We stop" 

testLoop1 td = runStateT (loop1) td >> return() 

cevap

15

sorun butonu Eğer y yazıp zaman, aslında iki karakter yazarak oluyor ki: 'y' kendisi ve dönüş tuşuna basarak gönderilen satırsonu karakteri. İlk turda, döngü 'y''u görür, ancak bir sonraki sefer '\n''u görür ve '\n''y' olmadığı için çıkar.

continue = do 
    putStrLn "Do you want to continue? (y/N)" 
    s <- getLine 
    return $ s == "y" 
: Eğer döngü girmeden önce

Ya sen bir satır beklemeden karakterleri işlemek izin veya özellikle bir seferde çizgileri işleyecek olan hSetBuffering stdin NoBuffering (eğer System.IO ithal etmek gerekir) yapabilirsiniz

Bu arada, liftIO $ testLoop1 td'u yazmak yerine, aynı durum monadında kalabilirsiniz: loop1 ile değiştirebilir ve tam olarak aynı şekilde çalışır.

testLoop1 = evalStateT loop1 

evalStateTrunStateT gibidir, ancak açıkça >> return() ile değerini atmak zorunda kalmamak, nihai halini kapsamaz: olarak

Ayrıca testLoop1 iyi yazılır.

+0

Tam olarak istediklerimi ve daha fazlasını sağla. Sadece kodu değiştirdiğimde ve '\ n 'yi gösteren bir yazdırma s eklediğimde yol bulmadaydım. LiftIO $ testLoop1 td -> loop1 üzerindeki ipucu için teşekkürler. Bu benim önceki testlerimden biriydi ve hangi iki koddan hangisinin değiştirileceğini merak ediyordum. Ve evalState ile iyi nokta. Bu benim statetransformer ve IO ile ilk saldırı oldu. –