2015-04-03 75 views
0

我有这样的代码片段:随机返回(g,g)而不是(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一个实例?

回答

5

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

作为提示,当您遇到类似的情况时,请在代码中间添加expr :: Type注释,并将其与您认为正确的类型相加。这将有助于在发生实际错误的地方发生矛盾。