三週前我問了一個問題how does hgearman-client work?。通過一些幫助我寫了一個簡單的客戶端應用程序,現在我正在工作。下面的工作者實現很好地編譯並運行,沒有任何異常。唯一的麻煩是W.runWorker gc (return g)
不會被執行。如果我理解正確,這是Haskell懶惰和Monad包裝的結果。但我沒有想到如何擺脫這個問題。有人能幫忙嗎?hgearman工人如何工作?
import qualified Control.Monad.State as S
import qualified Data.ByteString.Char8 as B
import qualified Network.Gearman.Client as C
import qualified Network.Gearman.Worker as W
import Network.Gearman.Internal (Function, Port)
import Network.Socket (HostName)
main :: IO()
main = do
c <- connect
case c of
Left e -> error $ B.unpack e
Right gc -> do
(res, _) <- flip S.runStateT gc $ do
g <- (W.registerWorker name func)
let t = W.runWorker gc (return g)
return t >> return()
return res
where
connect = C.connectGearman (B.pack "i") host port
host = "localhost"::HostName
port = 4730::Port
name = (B.pack "foo")::Function
func _ = B.pack "bar"
不幸的是,綁定t <- W.runWorker
的嘗試以編譯器異常結束。如果我這樣更改代碼:
Right gc -> do
(res, _) <- flip S.runStateT gc $ do
g <- (W.registerWorker name func)
t <- W.runWorker gc (return())
return t >> return ()
return res
編譯失敗,出現異常:
Couldn't match expected type `S.StateT
Network.Gearman.Internal.GearmanClient IO a0'
with actual type `IO GHC.Conc.Sync.ThreadId'
In a stmt of a 'do' block: t <- W.runWorker gc (return())
In the second argument of `($)', namely
`do { g <- (W.registerWorker name func);
t <- W.runWorker gc (return());
return t >> return() }'
IO GHC.Conc.Sync.ThreadId
是runWorker結果。
我真的很感激你的詳細答案。我也試過't < - W.runWorker gc(return g)'。不幸的是,在這種情況下,編譯器抱怨「無法匹配預期的類型」。這就是我轉向讓+返回的原因。我會將代碼段和異常添加到我的問題中。 – palik