7
我有以下程序,它在與runhaskell Toy.hs
一起運行時不產生輸出,而是無限期地掛起。據我瞭解,該程序應打印「嗨」,然後退出。我將不勝感激關於如何調試此類問題的答案和/或建議。我在github上使用Pipes 4.0.0(github.com/Gabriel439/Haskell-Pipes-Library)。使用管道的簡單程序掛起
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
哪裏讀者單子進入畫面,因爲我從來沒有調用它明確?它是否在管道內部使用? – ajp
@ajp這種行爲根本不是「管道」特有的。編譯器推斷在你稱之爲「forever」的上下文中使用哪個monad。你不小心使用了'forever go',因爲編譯器希望得到一個'Request - >'類型的函數,而不是一個管道,所以編譯器推斷出你指的monad是'Request - >'monad而不是'Server Request Response IO'單子像你想的那樣。 –