无法从(MonadRandom r)推断出(Functor r)

Ale*_* C. 4 haskell

简单的下面的代码

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作品,但我觉得这很难看.

我在这里错过了什么?

Sjo*_*her 9

理论上monad是仿函数,但遗憾的Functor是它不是一个Monad没有充分理由的超类.

而不是添加Functor r你也可以使用liftM而不是fmap.

编辑:似乎没有充分的理由.这些类在Haskell 1.3中一起引入,并且超类已经存在并且用于MonadPlusMonadZero.

  • 啊哈.我做的太多数学了.谢谢你,先生. (2认同)