Haskell 随机返回(g,g)而不是(Double,g)?

Haskell 随机返回(g,g)而不是(Double,g)?,haskell,types,ghc,Haskell,Types,Ghc,我有一段代码: markovNextSS :: (RandomGen g, Ord a) => (MarkovChain a, a, g) -> (MarkovChain a, a, g) markovNextSS (chain, prev, gen) = let (gen', roll) = randomR (0.0, 1.0) gen -- expected to get a (Double, g) above, -- but GHC 7.8.3

我有一段代码:

  markovNextSS :: (RandomGen g, Ord a) => (MarkovChain a, a, g) -> (MarkovChain a, a, g)
  markovNextSS (chain, prev, gen) = let
    (gen', roll) = randomR (0.0, 1.0) gen
    -- expected to get a (Double, g) above,
    -- but GHC 7.8.3 says that this is a (g, g) instead
    next = markovNext chain prev roll
    in (chain, next, gen')

为什么GHC会推断出上面的错误类型,特别是如果
RandomGen
不是
Random
的实例?

您在
randomR
调用中有
gen'
roll
。GHC知道由于
randomR
的定义,第二个arg必须与
gen
的类型相同,并且知道第一个arg必须是
g
,因为它是在必须是
g
的上下文中返回的。因此,当它最终与这一系列逻辑相矛盾时,就会出现这样一个无益的错误


作为提示,当您遇到这样的事情时,开始在代码中间添加“代码> Exp::Type < /Cord>注释,并将其视为正确的类型。这将有助于迫使矛盾发生在实际错误所在的位置。

您在
randomR
调用中有
gen'
roll
。GHC知道由于
randomR
的定义,第二个arg必须与
gen
的类型相同,并且知道第一个arg必须是
g
,因为它是在必须是
g
的上下文中返回的。因此,当它最终与这一系列逻辑相矛盾时,就会出现这样一个无益的错误

作为提示,当您遇到这样的事情时,开始在代码中间添加“代码> Exp::Type < /Cord>注释,并将其视为正确的类型。这将有助于迫使矛盾发生在实际错误所在的地方