我有这段代码:
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?
你的调用中有gen'和roll后退randomR.GHC知道第二ARG必须是同类型的gen,由于randomR的定义,并且知道第一个参数必须是g因为它在它必须是一个上下文返回g.因此,当它最终遇到与这一系列逻辑的矛盾时,它会变成一个无益的错误.
作为提示,当您遇到这样的事情时,开始expr :: Type在代码中间添加注释,使用您认为正确的类型.它将有助于在实际错误所在的位置强制发生矛盾.