Haskell刚性型变量错误

Haskell刚性型变量错误,haskell,random,polymorphism,Haskell,Random,Polymorphism,我是哈斯克尔的初学者。我想知道为什么以下方法不起作用: import System.Random simulator :: (RandomGen g) => g -> Double -> (Bool, g) simulator gen p = (x <= p, gen2) where (x, gen2) = random gen :: (Double, g) 导入系统。随机 模拟器::(RandomGen g)=>g->Double->(布尔,g) simul

我是哈斯克尔的初学者。我想知道为什么以下方法不起作用:

import System.Random

simulator :: (RandomGen g) => g -> Double -> (Bool, g)
simulator gen p = (x <= p, gen2)
    where (x, gen2) = random gen :: (Double, g)
导入系统。随机
模拟器::(RandomGen g)=>g->Double->(布尔,g)

simulator gen p=(x代码的问题在最后一行,有
:(Double,g)的那一行
类型注释。如前所述,您显然希望该注释中的
g
引用与
simulator
的类型签名中相同的
g
。这是一个完全合理的期望,但不幸的是,默认情况下不是这样,两个类型变量在不同的类型注释中具有相同的名称离子是不同的。(这就是为什么在错误消息中,GHC隐式地将第二个
g
重命名为
g1

幸运的是,您可以解决这个问题。GHC附带了一个名为
ScopedTypeVariables
的语言扩展。如果您添加
{-#language ScopedTypeVariables}
在模块顶部,这将启用扩展。但是,这仍然无法修复您的程序,因为
ScopedTypeVariables
仅适用于使用
forall
显式绑定的变量。因此,您需要添加
语言
杂注,并引入
forall
的显式用法:

{-# LANGUAGE ScopedTypeVariables #-}

import System.Random

simulator :: forall g. (RandomGen g) => g -> Double -> (Bool, g)
simulator gen p = (x <= p, gen2)
  where (x, gen2) = random gen :: (Double, g)
{-#语言范围的TypeVariables}
导入系统。随机
模拟器::forall g.(RandomGen g)=>g->Double->(布尔,g)
模拟机gen p=(x
{-# LANGUAGE ScopedTypeVariables #-}

import System.Random

simulator :: forall g. (RandomGen g) => g -> Double -> (Bool, g)
simulator gen p = (x <= p, gen2)
  where (x, gen2) = random gen :: (Double, g)