以下代码(并不意味着做任何有用的事情)可以正常编译:
{-# LANGUAGE ScopedTypeVariables #-}
import System.Random
uselessFunction :: (RandomGen g) => g -> [Int]
uselessFunction gen =
let (value::Int, newGen) = (random gen)
in (uselessFunction newGen)
我是否可以按照以下精神在模式匹配中使用类型变量(代码无法编译):
{-# LANGUAGE ScopedTypeVariables #-}
import System.Random
uselessFunction :: (RandomGen g, Random a) => g -> [a]
uselessFunction gen =
let (value::a, newGen) = (random gen)
in (uselessFunction newGen)
最佳答案
您已经注意到,ScopedTypeVariables
扩展允许您在模式上添加类型注释。但出于扩展的 main 目的,要使类型变量具有本地作用域,以便您可以在函数内引用它,您还必须在类型声明中使用 forall 来声明它,如下所示:
uselessFunction :: forall a g. (RandomGen g, Random a) => g -> [a]
这不会改变声明本身的含义,但会提示 GHC 您可能希望在本地使用该变量。
关于haskell - 是否可以在模式匹配中引用类型变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22273684/