以下代码(不打算做任何有用的事情)编译得很好:

{-# 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 扩展允许您在模式上放置类型注释。但是对于扩展的主要目的,要使类型变量具有局部范围以便您可以在函数内部引用它,您还必须在类型声明中使用 forall 声明它,如下所示:

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

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

关于haskell - 是否可以在模式匹配中引用类型变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22273684/

10-11 22:34
查看更多