我正在尝试生成一些随机数和新的随机数生成器。我还没有走得太远,但我遇到了这个错误,我不明白如何修复它。
我的代码是:
getGenerator :: RandomGen g => g
getGenerator = snd (next (mkStdGen 42))
我得到的错误是:
Couldn't match expected type ‘g’ with actual type ‘StdGen’
‘g’ is a rigid type variable bound by
the type signature
有人可以解释一下我做错了什么吗?我也尝试将RandomGen切换到StdGen但得到错误:
‘StdGen’ is applied to too many type arguments
我看到mkStdGen创建了一个StdGen,但根据维基页面,StdGen是RandomGen的一个实例。有没有办法以某种方式将StdGen转换为RandomGen?我现在真的很困惑。
答案 0 :(得分:6)
问题在于您的声明比实际定义更通用。您的声明声称getGenerator
的类型可以是实现RandomGen
类的任何类型。假设我有这样的类型,MyRandomGen
。然后我应该能够写出像
let v = getGenerator :: MyRandomGen
并将v
绑定到MyRandomGen
值。
但是,您的实际定义并非一般。 snd (next (mkStdGen 42))
的值总是类型StdGen
,而不是g
的任意实例RandomGen
。
解决方案是诚实地评估getGenerator
评估的内容。
getGenerator :: StdGen
getGenerator = snd (next (mkStdGen 42))