Я смотрю на следующую ошибку типа и совершенно не знаю, что ее вызвало:
• Couldn't match type ‘StM m ()’ with ‘StM m a2’
Expected type: m (Async (StM m a2))
Actual type: m (Async (StM m ()))
NB: ‘StM’ is a non-injective type family
The type variable ‘a2’ is ambiguous
• In a stmt of a 'do' block:
jobPollerAsync <- async $ jobPoller jobRunner
Мне не удалось написать минимальный фрагмент кода для воспроизведения этой ошибки. Следующий фрагмент кода, имеющий ту же «форму», что и исходный код, компилируется без ошибок.
{-# LANGUAGE RankNTypes, ScopedTypeVariables #-}
module Try11 where
import Control.Concurrent.Async.Lifted
import Control.Monad.Trans.Control
import Data.IORef
import Control.Monad.IO.Class
import Control.Monad.Catch
data JobEnv = JobEnv
data Job = Job
type JobRunner = (forall m . (MonadIO m) => Job -> m ())
class (MonadBaseControl IO m, MonadIO m, MonadThrow m, MonadCatch m) => HasJobMonitor m where
getJobEnv :: m JobEnv
jobMonitor :: (HasJobMonitor m) => JobRunner -> m ()
jobMonitor jobRunner = do
jobPollerAsync <- async (jobPoller jobRunner)
x <- liftIO $ newIORef jobPollerAsync
pure ()
jobPoller :: (HasJobMonitor m) => JobRunner -> m ()
jobPoller _ = pure ()
Любая помощь с отладкой?