Haskell 是否可以在模式匹配中引用类型变量?

Haskell 是否可以在模式匹配中引用类型变量?,haskell,pattern-matching,type-variables,Haskell,Pattern Matching,Type Variables,以下代码(并不打算做任何有用的事情)编译得很好: {-# 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) => g -> [Int]
uselessFunction gen = 
  let (value::Int, newGen) = (random gen)
  in (uselessFunction newGen)
我是否可以本着以下精神在模式匹配中使用类型变量(代码无法编译):


您已经注意到,
ScopedTypeVariables
扩展允许您在模式上添加类型注释。但对于扩展的主要目的,要使类型变量具有局部作用域,以便可以在函数中引用它,还必须在类型声明中使用forall声明它,如下所示:

uselessFunction :: forall a g. (RandomGen g, Random a) => g -> [a]

这不会改变声明本身的含义,但会提示GHC您可能希望在本地使用变量。

实际解决方法如所述:

多年来,GHC对Haskell实施了一个扩展 允许在类型签名和模式中绑定类型变量,以及 审查条款。此扩展从未正确指定。我们 纠正这一疏忽。有了正式的规范, 通向绑定类型设计的迷宫式路径 模式中的变量变得非常清晰。因此,我们延长期限 ScopedTypeVariables显式绑定类型变量,避免 历史垃圾箱的代理解决方案


特别是,我认为
forall
只是为了向后兼容,所以打开扩展不会意外地破坏以前有效的代码。
uselessFunction :: forall a g. (RandomGen g, Random a) => g -> [a]