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)