2011-10-23 5 views
4

Le simple code suivantImpossible déduire (Functor r) de (MonadRandom r)

import Control.Monad 
import Control.Monad.Random 

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

rendements l'erreur:

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

Cela me est bizarre à cause de

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

dans Control.Monad.Random.Class fichier source, et puisque les monades sont des foncteurs, GHC aurait dû en déduire que r est af unctor dans mon contexte. J'ai également essayé d'importer Control.Monad.Random.Class sans succès.

Ajoutant manuellement la contrainte Functor sur r fonctionne, mais je trouve cela assez moche.

Qu'est-ce qui me manque ici?

Répondre

9

Théoriquement, les monades sont des foncteurs, mais malheureusement Functor n'est pas une super-classe de Monad sans raison valable. Au lieu d'ajouter Functor r, vous pouvez également utiliser liftM au lieu de fmap.

Edit: Il semble vraiment n'y avoir aucune bonne raison. Les classes ont été introduites ensemble dans Haskell 1.3, et les superclasses existaient déjà et ont été utilisées pour MonadPlus et MonadZero.

+2

Aha. Je fais trop de mathématiques. Merci Monsieur. –