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

bb9*_*b94 0 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 says that this is a (g, g) instead
    next = markovNext chain prev roll
    in (chain, next, gen')
Run Code Online (Sandbox Code Playgroud)

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

bdo*_*lan 5

你的调用中有gen'roll后退randomR.GHC知道第二ARG必须是同类型的gen,由于randomR的定义,并且知道第一个参数必须是g因为它在它必须是一个上下文返回g.因此,当它最终遇到与这一系列逻辑的矛盾时,它会变成一个无益的错误.

作为提示,当您遇到这样的事情时,开始expr :: Type在代码中间添加注释,使用您认为正确的类型.它将有助于在实际错误所在的位置强制发生矛盾.