Связанный вопрос - Безопасно ли наследовать MonadThrow, MonadCatch, MonadBaseControl, MonadUnliftIO и т. Д.? - где я включил оба - DeriveAnyClass
и GeneralizedNewtypeDeriving
для компиляции кода, но не стал смотреть на зловещие предупреждения. Теперь, когда я запускаю свой отредактированный код, он выдает ошибку времени выполнения:
No instance nor default method for class operation >>=
Итак, я удалил DeriveAnyClass
и оставил ТОЛЬКО GeneralizedNewtypeDeriving
и получил следующую ошибку компиляции:
{-# LANGUAGE DataKinds, GADTs, ScopedTypeVariables, TypeFamilies, AllowAmbiguousTypes, RankNTypes, StandaloneDeriving, UndecidableInstances #-}
newtype AuthM (fs :: [FeatureFlag]) auth m a =
AuthM (ReaderT (Auth auth) m a)
deriving (Functor, Applicative, Monad, MonadReader (Auth auth), MonadIO, MonadThrow, MonadCatch, MonadMask, MonadUnliftIO)
-- • Couldn't match representation of type ‘m (Control.Monad.IO.Unlift.UnliftIO
-- (AuthM fs auth m))’
-- with that of ‘m (Control.Monad.IO.Unlift.UnliftIO
-- (ReaderT (Auth auth) m))’
-- arising from the coercion of the method ‘Control.Monad.IO.Unlift.askUnliftIO’
-- from type ‘ReaderT
-- (Auth auth)
-- m
-- (Control.Monad.IO.Unlift.UnliftIO (ReaderT (Auth auth) m))’
-- to type ‘AuthM
-- fs auth m (Control.Monad.IO.Unlift.UnliftIO (AuthM fs auth m))’
-- NB: We cannot know what roles the parameters to ‘m’ have;
-- we must assume that the role is nominal
-- • When deriving the instance for (MonadUnliftIO (AuthM fs auth m))
-- |
-- 82 | deriving (Functor, Applicative, Monad, MonadReader (Auth auth), MonadIO, MonadThrow, MonadCatch, MonadMask, MonadUnliftIO)
-- | ^^^^^^^^^^^^^
Примечание. Я понимаю, что первая ошибка о >>=
не имеет ничего общего с ошибкой о MonadUnliftIO
. Я подтвердил, что предупреждений об отсутствии >>=
при выключенном DeriveAnyClass
нет.
Думаю, мне нужно написать экземпляр для MonadUnliftIO
самому, потому что компилятор, вероятно, не сможет понять это при наличии newtype
И фантомной переменной типа. Однако я просто не могу понять, как определить _ 13_ для моего типа, указанного выше.
Попытка 1 при минимальном фрагменте кода
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Try13 where
import Control.Monad.Reader
import UnliftIO
import Control.Monad.Catch
data Auth = Auth
newtype AuhM m a = AuthM (ReaderT Auth m a)
deriving(Functor, Applicative, Monad, MonadReader Auth, MonadIO, MonadThrow, MonadCatch, MonadMask, MonadUnliftIO)
-- • Couldn't match representation of type ‘m (UnliftIO (AuhM m))’
-- with that of ‘m (UnliftIO (ReaderT Auth m))’
-- arising from the coercion of the method ‘askUnliftIO’
-- from type ‘ReaderT Auth m (UnliftIO (ReaderT Auth m))’
-- to type ‘AuhM m (UnliftIO (AuhM m))’
-- NB: We cannot know what roles the parameters to ‘m’ have;
-- we must assume that the role is nominal
-- • When deriving the instance for (MonadUnliftIO (AuhM m))
-- |
-- 12 | deriving(Functor, Applicative, Monad, MonadReader Auth, MonadIO, MonadThrow, MonadCatch, MonadMask, MonadUnliftIO)
-- | ^^^^^^^^^^^^^
--
Auth
иFeatureFlag
или упростить этот код до минимальной части, которая воспроизводит эту проблему? Сейчас невозможно легко воспроизвести ошибку, которую вы получаете, и я уверен, что вы могли бы вырезать несколько нерелевантных частей. - person Bartek Banachewicz   schedule 25.07.2019AuhM
vsAuthM
? - person lehins   schedule 25.07.2019