haskellpattern-matchingtype-variables

Is is possible to refer to Type Variables in pattern matching?


The following code (which is not meant to do anything useful) compiles fine :

{-# LANGUAGE ScopedTypeVariables #-}
import System.Random

uselessFunction :: (RandomGen g) => g -> [Int]
uselessFunction gen = 
  let (value::Int, newGen) = (random gen)
  in (uselessFunction newGen)

Is it possible for me to use type variables in the pattern matching, in the following spirit (code fails to compile):

{-# LANGUAGE ScopedTypeVariables #-}
import System.Random

uselessFunction :: (RandomGen g, Random a) => g -> [a]
uselessFunction gen = 
  let (value::a, newGen) = (random gen)
  in (uselessFunction newGen)

Solution

  • You've already noticed that the ScopedTypeVariables extension allows you to put type annotations on patterns. But for the extension's main purpose, to make a type variable be locally scoped so that you can refer to it inside the function, you must also declare it with a forall in the type declaration, like so:

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

    This doesn't change the meaning of the declaration itself, but hints to GHC that you may want to use the variable locally.