Не удалось сопоставить тип `StM m ()` с `StM ma` при использовании Control.Concurrent.Async.Lifted - PullRequest
0 голосов
/ 09 июля 2019

Я смотрю на следующую ошибку типа и совершенно не знаю, что ее вызвало:

    • 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 ()

Любая помощь с отладкой?

...