2013-06-30 32 views
7

runhaskell Toy.hs ile çalışırken çıktı üretmeyen ve süresiz olarak askıda kalan aşağıdaki programa sahibim. Anlayışımla, program "merhaba" yazmalı ve sonra çıkmalıdır. Böyle bir sorunun nasıl çözüleceğine dair bir cevap ve/veya tavsiyede bulunmaktan memnuniyet duyarım. Github'dan (github.com/Gabriel439/Haskell-Pipes-Library) Pipes 4.0.0 kullanıyorum.Borular kullanarak basit program kilitleniyor

module Toy where 

import Pipes 
import Control.Monad.State 

type Request = String 
type Response = String 

serveChoice :: Request -> Server Request Response IO() 
serveChoice = forever go 
    where go req = do 
     lift $ putStrLn req 
     respond req 

run :: Monad m =>() -> Client Request Response (StateT Int m)() 
run() = do 
    request "hi" 
    return() 

main :: IO() 
main = evalStateT (runEffect $ hoist lift . serveChoice >-> run $()) 0 

cevap

9

Bunu, forever yerine foreverK kullanmak gerekir:

module Toy where 

import Pipes 
import Pipes.Prelude (foreverK) 
import Control.Monad.State 

type Request = String 
type Response = String 

serveChoice :: Request -> Server Request Response IO() 
serveChoice = foreverK go 
    where go req = do 
     lift $ putStrLn req 
     respond req 

run :: Monad m =>() -> Client Request Response (StateT Int m)() 
run() = do 
    request "hi" 
    return() 

main :: IO() 
main = evalStateT (runEffect $ hoist lift . serveChoice >-> run $()) 0 

orijinal versiyonu asılı nedeni (yani ((->) a) monad) ve Reader monad içinde forever kullanılan olmasıdır boru monad. Bu monad içinde, forever eşdeğerdir:

-- i.e.  m b ->  m c 
forever :: (a -> b) -> (a -> c) 
forever m = m >> forever m 
      = m >>= \_ -> forever m 
      = \a -> (\_ -> forever m) (m a) a 
      = \a -> forever m a 
      = forever m 

foreverK ne istediğini muhtemelen, bu pipes-3.3.0 öğretici tanıtıldı Server s için aynı deyim olduğundan.

Bu değişiklik artık programın hangi giderir normalde tamamlar:

>>> main 
hi 
>>> 
Ben açıkça çağrılan asla Okuyucu monad, içine resim geliyor
+0

? Borularda dahili olarak mı kullanılıyor? – ajp

+4

@ajp Bu davranış hiç 'borulara özgü değil. Derleyici, "sonsuza dek" dediğiniz bağlamda kullanmak için hangi monad kullanır. Yanlışlıkla '' sonsuza dek '' derleyicinin 'Request ->' türünde bir işlev beklemediği bir boru kullandığını, dolayısıyla derleyicinin kastettiğim monadın 'Request ->' monad olduğunu ve 'Sunucu İstek Yanıtı' olduğunu anladınız Senin istediğin gibi bir monad. –