Подтвердить что ты не робот

Как сделать MonadRandom functor?

Кажется, что MonadRandom из пакета random-fu не является Functor, так как я получаю такие ошибки, как:

Could not deduce (Functor m) arising from a use of ‘_1’
from the context (MonadRandom m)

Я попытался добавить следующий код:

instance Functor MonadRandom where
    fmap = liftM

instance Applicative MonadRandom where
    pure  = return
    (<*>) = ap

но я получаю ошибку:

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’
4b9b3361

Ответ 1

MonadRandom - это класс, а не тип с видом * -> *, например Maybe. Обычно вы используете что-то вроде

instance MonadRandom m => Functor m where
    fmap = liftM

instance MonadRandom m => Applicative m where
    pure  = return
    (<*>) = ap

Однако, в этом случае экземпляры MonadRandom уже являются функторами, поэтому теперь экземпляры неоднозначны! Вместо этого вы должны добавить ограничение Functor в свою функцию:

yourFunction :: (MonadRandom m, Functor m) => ...
-- instead of yourFunction :: (MonadRandom m) => ...