[Haskell-beginners] how does hgearman-worker work?

David McBride toad3k at gmail.com
Thu Apr 6 17:54:30 UTC 2017

There are a couple problems.  One is that runWorker has a type of IO
ThreadId.  I have no idea why he would write it that way in his API.
If you want to run it from within StateT GearmanClient IO, you must
use liftIO.

liftIO :: (MonadIO m) => IO a -> StateT s IO

instance MonadIO (StateT s IO) where
  liftIO :: IO a -> StateT s IO a

liftIO $ runWorker gc whatever.

When you are working in monadic code, you connect monadic components
based on their types.  If you are a procedure

someprocedure :: IO ???

Then every statement you used must some form of ???.  runWorker
returns (IO ThreadId), return () returns (IO ()), return res returns
IO (whatever type res is).  I'm not sure what you intend to do with
the threadId, save it or ignore it, but you might try something like

someprocedure' :: IO (Maybe ThreadId)
someprocedure' = do
  connectGearman >>= \case
    Left e -> return Nothing
    Right gc -> do
      (res, _) <- flip runStateT gc $ do
        g <- registerWorker undefined undefined
        t <- liftIO $ runWorker gc undefined
        return $ Just t
      return res

This is just a guess based on what I know about gearman and that
particular api choice.  He may have intended you to use runWorker
outside of the setup phase.  He certainly doesn't prevent it.

someprocedure' :: IO ()
someprocedure' = do
  gs <- connectGearman >>= \case
    Left e -> return []
    Right gc -> do
      (res, _) <- flip runStateT gc $ do
        g <- registerWorker undefined undefined
        g2 <- registerWorker undefined undefined
        return $ [g,g2]
      return res

  mapM_ (\g -> runWorker g (return ())) gs

On Thu, Apr 6, 2017 at 11:37 AM,  <info at maximka.de> wrote:
> A while ago I asked similar question about hgearman client. With help I got in the List (https://mail.haskell.org/pipermail/beginners/2017-March/017435.html) and I implemented a gearman client in Haskell. (here the implementation http://stackoverflow.com/questions/42774191/how-does-hgearman-client-work)
> Unfortunately I need again some help be implementation of gearman worker.
> I post here only the snippet with the badly implemented code in hope to find again some help. (Complete implementation: http://stackoverflow.com/questions/43155857/how-does-hgearman-worker-work)
> Right gc -> do
>   (res, _) <- flip S.runStateT gc $ do
>     g <- (W.registerWorker name func)
>     t <- W.runWorker gc (return ())
>     return t >> return  ()
>   return res
> This throws exception:
> 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 () }
> What do I wrong with W.runWorker gc (return ())?
> runWorker :: GearmanClient -> Gearman () -> IO ThreadId
> https://hackage.haskell.org/package/hgearman-
> Best regards,
> Alexei
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

More information about the Beginners mailing list