简单的下面的代码
import Control.Monad
import Control.Monad.Random
psum :: (MonadRandom r) => Int -> r Double -> r Double
psum n x = fmap sum $ replicateM n x
Run Code Online (Sandbox Code Playgroud)
产生错误:
Could not deduce (Functor r) arising from a use of `fmap'
from the context (MonadRandom r)
Run Code Online (Sandbox Code Playgroud)
这对我来说很奇怪
class (Monad m) => MonadRandom m where ...
Run Code Online (Sandbox Code Playgroud)
在Control.Monad.Random.Class源文件中,由于monad是仿函数,GHC应该推断出r在我的上下文中是一个仿函数.我也尝试导入但Control.Monad.Random.Class没有成功.
手动添加Functor约束r作品,但我觉得这很难看.
我在这里错过了什么?
理论上monad是仿函数,但遗憾的Functor是它不是一个Monad没有充分理由的超类.
而不是添加Functor r你也可以使用liftM而不是fmap.
编辑:似乎没有充分的理由.这些类在Haskell 1.3中一起引入,并且超类已经存在并且用于MonadPlus和MonadZero.