Я пытаюсь выяснить, как реализовать экземпляр MonadBaseControl для типа Foo, который является оболочкой newtype вокруг экземпляра StateT. Вы думаете, что это будет реализовано точно так же, как this, но это, похоже, не так. Я предполагаю, что часть штата вызывает проблему здесь, так есть способ ее сбросить?MonadBaseControl IO ... StateT Реализация
Код:
newtype Foo a = Foo { unFoo :: StateT Int IO a }
deriving (Monad, Applicative, Functor, MonadBase IO)
instance MonadBaseControl IO Foo where
type StM Foo a = a
liftBaseWith f = Foo $ liftBaseWith $ \q -> f (q . unFoo)
restoreM = Foo . restoreM
Ошибка:
Couldn't match type ‘a’ with ‘(a, Int)’
‘a’ is a rigid type variable bound by
the type signature for restoreM :: StM Foo a -> Foo a
Expected type: a -> StateT Int IO a
Actual type: StM (StateT Int IO) a -> StateT Int IO a
Relevant bindings include
restoreM :: StM Foo a -> Foo a
In the second argument of ‘(.)’, namely ‘restoreM’
In the expression: Foo . restoreM
Ницца, это сработало. Благодаря! Из любопытства, как мне написать версию вида, чтобы мне не нужны «UndecidableInstances»? – Josh
@Josh Что вы подразумеваете под «версией видов»? –
Woops извините, полагаю, я сформулировал это неправильно? По существу, как использовать «forall a. StM (StateT Int IO) a», чтобы избежать «UndecidableInstances». – Josh