Mam następujący program, który nie generuje żadnego wyjścia po uruchomieniu z runhaskell Toy.hs
i zamiast tego zawiesza się na czas nieokreślony. Według mojego zrozumienia, program powinien wydrukować "cześć", a następnie wyjść. Byłbym wdzięczny za odpowiedź i/lub poradę, jak debugować taki problem. Używam Pipes 4.0.0 z github (github.com/Gabriel439/Haskell-Pipes-Library).Prosty program za pomocą potoków zawiesza się
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
Skąd monada Reader przyjść na zdjęciu, jak nigdy nie powoływać go wyraźnie? Czy jest używany wewnętrznie w Pipes? – ajp
@ajp To zachowanie nie jest w ogóle specyficzne dla rur. Kompilator określa, której monady użyć w kontekście, w którym nazywa się "na zawsze". Przez przypadek użyłeś 'forever go', gdzie kompilator oczekiwał funkcji typu' Request -> ', a nie potoku, więc kompilator wywnioskował, że monada miała na myśli' Request -> 'monad, a nie' Server Request Response ' Moneta IO, tak jak zamierzałeś. –