I have type Foo which is simple wrapper around Cont a a. I would like to make Foo type an instance of Monad class. I try this:
import Control.Monad.Cont newtype Foo a = Foo {unFoo :: Cont a a} instance Monad Foo where return = Foo . return Foo inner >>= func = Foo (inner >>= newFunc) where newFunc x = (unFoo $ func x) But I got this error:
Couldn't match type `a' with `b' `a' is a rigid type variable bound by the type signature for >>= :: Foo a -> (a -> Foo b) -> Foo b at Classes.hs:7:5 `b' is a rigid type variable bound by the type signature for >>= :: Foo a -> (a -> Foo b) -> Foo b at Classes.hs:7:5 Expected type: ContT b Data.Functor.Identity.Identity a Actual type: Cont a a In the first argument of `(>>=)', namely `inner' In the first argument of `Foo', namely `(inner >>= newFunc)' In the expression: Foo (inner >>= newFunc) How to add Monad instance for Foo correctly?