我正在修改以下代码作为作业的一部分:
rand :: Random a => State StdGen a
rand = do
gen <- get
let (x, gen') = random gen
put gen'
return x
我被要求写一个函数randR
完成与相同的任务rand
函数,但允许指定范围。所需的类型是Random a => (a, a) -> State StdGen a
。我写了以下代码:
randR :: Random a => (a, a) -> State StdGen b
randR (lo, hi) = do
gen <- get
let (x, gen') = randomR (lo, hi) gen
put gen'
return x
这看起来是正确的;它几乎和模型一模一样。但我收到以下错误:
Could not deduce (a ~ b)
from the context (Random a)
bound by the type signature for
randR :: Random a => (a, a) -> State StdGen b
什么是(a ~ b)
意思是,为什么编译器不能从“上下文”中“推断”它?
错误消息表明签名中存在拼写错误randR
: randR :: Random a => (a, a) -> State StdGen b
。它应该是... -> RandState a
.
该消息大致表明编译器知道a
and b
需要是相同的类型,但不能证明情况确实如此。a ~ b
is an “平等约束” https://www.haskell.org/ghc/docs/7.4.2/html/users_guide/equality-constraints.html; read ~
大致意思是=
.
关于上下文的部分只是编译器告诉你它是什么的方式does了解类型约束。在这种情况下,它几乎完全没有帮助,但你经常会看到类似的内容Could not deduce (Floating a) from the context (Num a)
或其他一些表明该函数需要额外约束的直接指示。
顺便说一句,通过一些扩展,您could通过添加 GHC 要求的约束来解决此问题:randR :: (Random a, a ~ b) => (a, a) -> State StdGen b
应该可以正常工作。 (我认为。)为了您的目的,不用担心这个......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)