Ho il seguente programma, che non produce output quando viene eseguito con runhaskell Toy.hs
e si blocca invece indefinitamente. Secondo la mia comprensione, il programma dovrebbe stampare "ciao" e quindi uscire. Gradirei una risposta e/o un consiglio su come eseguire il debug di questo problema. Sto usando Pipes 4.0.0 su github (github.com/Gabriel439/Haskell-Pipes-Library).Il programma semplice che utilizza i tubi si blocca
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
Da dove viene la monade Reader entrano in gioco, come non ho mai invocato esplicitamente? Viene utilizzato internamente in pipe? – ajp
@ajp Questo comportamento non è affatto specifico di 'pipe'. Il compilatore deduce quale monade usare dal contesto in cui si chiama 'per sempre'. Hai usato per sbaglio 'per sempre go' dove il compilatore si aspettava una funzione di tipo' Request -> ', non una pipe, quindi il compilatore deduceva che la monade che intendevi era la' Request -> 'monad e non la' Request Request Response IO' monad come volevi. –