如何解决"刚性类型变量受" RandomGen的错误?

时间:2016-04-14 20:16:11

标签: haskell functional-programming

我正在尝试生成一些随机数和新的随机数生成器。我还没有走得太远,但我遇到了这个错误,我不明白如何修复它。

我的代码是:

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?我现在真的很困惑。

1 个答案:

答案 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))