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

标签 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, 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/

相关文章:

haskell - 如何在特定情况下使用高阶结构

opengl - GLU NURBS 渲染错误

python - 如果某些多个关键字匹配则过滤字符串

python - 删除连续的字母重复项

haskell - 如何指定内联类型中使用的类型变量,是否与函数定义中使用的类型变量相同?

haskell - Haskell 拥有单参数函数的原因是像 lambda 演算吗?

haskell - 自定义数据类型(带有状态的+)的Monadic Haskell运算符

Java正则表达式匹配多行

Java - 不兼容的类型 : Object cannot be converted to type variable (Stacks in DFS)

java - 通配符和类型变量有什么区别?