Не удалось вывести (функтор r) из (MonadRandom r)

#haskell

#хаскелл

Вопрос:

Простой следующий код

 import Control.Monad
import Control.Monad.Random

psum :: (MonadRandom r) => Int -> r Double -> r Double
psum n x = fmap sum $ replicateM n x
 

выдает ошибку:

 Could not deduce (Functor r) arising from a use of `fmap'
    from the context (MonadRandom r)
 

Это странно для меня из-за

 class (Monad m) => MonadRandom m where ...
 

в Control.Monad.Random.Class исходном файле, и поскольку монады являются функторами, GHC должен был вывести, что r это функтор в моем контексте. Я также безуспешно пытался импортировать Control.Monad.Random.Class .

Добавление вручную Functor ограничения на r работы, но я нахожу это довольно уродливым.

Чего мне здесь не хватает?

Ответ №1:

Теоретически монады являются функторами, но, к сожалению Functor , не являются суперклассом Monad без уважительной причины.

Вместо добавления Functor r вы также можете использовать liftM вместо fmap .

Редактировать: на самом деле, похоже, нет веской причины. Классы были введены вместе в Haskell 1.3, а суперклассы уже существовали и использовались для MonadPlus и MonadZero .

Комментарии:

1. Ага. Я слишком много занимаюсь математикой. Спасибо, сэр.