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

random returning (g, g) instead of (Double, g)?

我有这段代码:

  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 向后。由于 randomR 的定义,GHC 知道第二个 arg 必须与 gen 的类型相同,并且知道第一个 arg 必须是 g 因为它在上下文中返回它必须是 g。因此,当它最终 运行 与这一系列逻辑相矛盾时,它会出现一个无用的错误。

作为提示,当您 运行 遇到这样的事情时,请开始在您的代码中间添加 expr :: Type 您认为正确类型的注释。这将有助于迫使矛盾发生在实际错误所在的地方。