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>注释,并将其视为正确的类型。这将有助于迫使矛盾发生在实际错误所在的地方