Skip to content

Incorrect pattern synonym types in error messages

Here are some examples of incorrect pattern synonym types in error messages.

  • *Example 1**
{-# LANGUAGE PatternSynonyms #-}
module Mod1 where

pattern Pat :: Eq a => Maybe a
pattern Pat <- Just 42

This gives the error (note the missing Eq a =>):

Mod1.hs:4:21: error:
    * Could not deduce (Num a) arising from the literal `42'
      from the context: Eq a
        bound by the type signature for pattern synonym `Pat':
                   Maybe a
        at Mod1.hs:4:9-11
      Possible fix:
        add (Num a) to the context of
          the type signature for pattern synonym `Pat':
            Maybe a
    * In the pattern: 42
      In the pattern: Just 42
      In the declaration for pattern synonym `Pat'
  • *Example 2**
{-# LANGUAGE PatternSynonyms, GADTs #-}
module Mod1 where

data T where MkT :: a -> T
pattern Pat :: () => b ~ Bool => a -> b -> (b, T)
pattern Pat x y = (y, MkT x)

We get the error (note the missing contexts and the incorrect quantification forall b, missing a):

Mod1.hs:6:27: error:
    * Couldn't match type `b' with `Bool'
        arising from the "provided" constraints claimed by
          the signature of `Pat'
      `b' is a rigid type variable bound by
        the type signature for pattern synonym `Pat':
          forall b. a -> b -> (b, T)
        at Mod1.hs:5:16
    * In the declaration for pattern synonym `Pat'
    * Relevant bindings include y :: b (bound at Mod1.hs:6:20)
  • *Example 3**
{-# LANGUAGE PatternSynonyms #-}
module Mod1 where

pattern Pat :: Eq a => Show a => a -> Maybe a
pattern Pat x <- Just x

We get the error:

Mod1.hs:4:23: error:
    * Could not deduce (Show a)
        arising from the "provided" constraints claimed by
          the signature of `Pat'
      from the context: Eq a
        bound by the type signature for pattern synonym `Pat':
                   a -> Maybe a
        at Mod1.hs:4:9-11
    * In the declaration for pattern synonym `Pat'

Here we could perhaps remove the whole "from the context ... at Mod1.hs:4:9-11" part, as it doesn't make much sense to tell the user that we could not deduce a "provided" constraint from the "required" context.

  • *Example 4**
{-# LANGUAGE PatternSynonyms, GADTs #-}
module Mod1 where

data T a where MkT :: (Num a, Show a) => a -> T a
pattern Pat :: (Eq a) => (Show a) => T a
pattern Pat = MkT 42

This gives the error (note that the signature in the error is of the pattern synonym Pat when used in an expression context):

Mod1.hs:6:15: error:
    * Could not deduce (Num a) arising from a use of `MkT'
      from the context: (Eq a, Show a)
        bound by the type signature for pattern synonym `Pat':
                   (Eq a, Show a) => T a
        at Mod1.hs:6:1-20
      Possible fix:
        add (Num a) to the context of
          the type signature for pattern synonym `Pat':
            (Eq a, Show a) => T a
    * In the expression: MkT 42
      In an equation for `$bPat': $bPat = MkT 42

The problems in these four examples are caused by the use of SigSkol (PatSynCtxt n) (Check ty) for representing pattern synonym types (and the types of bidirectional pattern synonyms when used in an expression context).

A possible solution can be found in D1967.

Simon notes the following:

Example 3 raises an interesting point we can debate once we have a ticket. Namely, is this ok?

pattern Pat :: Ix a => Ix a => a -> Maybe a
pattern Pat x <- Just x
Trac metadata
Trac field Value
Version 8.0.1-rc2
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC mpickering, simonpj
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information