【问题标题】:How to solve "rigid type variable bound by" error for RandomGen? [duplicate]如何解决 RandomGen 的“刚性类型变量绑定”错误? [复制]
【发布时间】:2016-08-06 14:21:55
【问题描述】:

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

我的代码是:

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,但根据 wiki 页面,StdGen 是 RandomGen 的一个实例。有没有办法以某种方式将 StdGen 转换为 RandomGen?我现在真的很困惑。

【问题讨论】:

    标签: haskell functional-programming


    【解决方案1】:

    问题在于您的声明比实际定义更笼统。您的声明声称getGenerator 的类型可以是实现RandomGen 类的任何类型。假设我有这样的类型,MyRandomGen。然后我应该能够写出类似的东西

    let v = getGenerator :: MyRandomGen
    

    并将v 绑定到MyRandomGen 值。

    但是,您的实际定义并不那么笼统。 snd (next (mkStdGen 42)) 的值始终StdGen 类型,而不是RandomGen 的任意实例g

    解决方案是诚实地告知 getGenerator 的计算结果。

    getGenerator :: StdGen
    getGenerator = snd (next (mkStdGen 42))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多