随机返回 (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
您认为正确类型的注释。这将有助于迫使矛盾发生在实际错误所在的地方。
我有这段代码:
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
您认为正确类型的注释。这将有助于迫使矛盾发生在实际错误所在的地方。