以下代码(不打算做任何有用的事情)编译得很好:
{-# 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/