#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. Ага. Я слишком много занимаюсь математикой. Спасибо, сэр.