It seems that MonadRandom from the random-fu package is not a Functor, as I am getting errors like:
Could not deduce (Functor m) arising from a use of ‘_1’
from the context (MonadRandom m)
I've tried adding the following code:
instance Functor MonadRandom where
fmap = liftM
instance Applicative MonadRandom where
pure = return
(<*>) = ap
but I get the error:
The first argument of ‘Functor’ should have kind ‘* -> *’,
but ‘MonadRandom’ has kind ‘(* -> *) -> Constraint’
In the instance declaration for ‘Functor MonadRandom’
The first argument of ‘Applicative’ should have kind ‘* -> *’,
but ‘MonadRandom’ has kind ‘(* -> *) -> Constraint’
In the instance declaration for ‘Applicative MonadRandom’
1 Answer 1
MonadRandom is a class, not a type with kind * -> *, like Maybe for example. Usually, you would use something like
instance MonadRandom m => Functor m where
fmap = liftM
instance MonadRandom m => Applicative m where
pure = return
(<*>) = ap
However, in this case the instances of MonadRandom are already functors, so now the instances are ambiguous! Instead, you should to add the Functor constraint at your function:
yourFunction :: (MonadRandom m, Functor m) => ...
-- instead of yourFunction :: (MonadRandom m) => ...
answered Sep 2, 2014 at 11:50
Zeta
106k13 gold badges205 silver badges249 bronze badges
Sign up to request clarification or add additional context in comments.
Comments
lang-hs
MonadRandomis a type-class, you can't make those instances of other type-classes._1.{-# LANGUAGE KindSignatures #-}import GHC.Extstry e.g.class Foo (c :: * -> Constraint)instance Foo Num. Whether that makes any sense at all is a different question...