Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
  • Sign in / Register
  • GHC GHC
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Locked Files
  • Issues 5,250
    • Issues 5,250
    • List
    • Boards
    • Service Desk
    • Milestones
    • Iterations
  • Merge requests 561
    • Merge requests 561
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
    • Test Cases
  • Deployments
    • Deployments
    • Releases
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Code review
    • Insights
    • Issue
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • Glasgow Haskell CompilerGlasgow Haskell Compiler
  • GHCGHC
  • Issues
  • #14395
Closed
Open
Issue created Oct 27, 2017 by Ryan Scott@RyanGlScottMaintainer

Redefining pattern synonym in GHCi triggers "‘p’ is untouchable" error

Load this file into GHCi:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE PatternSynonyms #-}
module Bug where

data Foo a where
  FooInt :: Foo Int

pattern Bar :: () => (a ~ Int) => Foo a
pattern Bar = FooInt

And attempt to redefine Bar as follows:

$ /opt/ghc/8.2.1/bin/ghci Bug.hs
GHCi, version 8.2.1: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
[1 of 1] Compiling Bug              ( Bug.hs, interpreted )
Ok, 1 module loaded.
λ> pattern Bar = Nothing

<interactive>:1:15: error:
    • Couldn't match expected type ‘p’ with actual type ‘Maybe a0’
        ‘p’ is untouchable
          inside the constraints: a ~ Int
          bound by a pattern with pattern synonym:
                     Bar :: forall a. () => a ~ Int => Foo a,
                   in an equation for ‘pattern’
          at <interactive>:1:9-11
      ‘p’ is a rigid type variable bound by
        the inferred type of pattern :: Foo a -> p at <interactive>:1:1-21
      Possible fix: add a type signature for ‘pattern’
    • In the expression: Nothing
      In an equation for ‘pattern’: pattern Bar = Nothing
    • Relevant bindings include
        pattern :: Foo a -> p (bound at <interactive>:1:1)

There are two issues here:

  1. There are several places in the error message that refer to a pattern with no name!
                   in an equation for ‘pattern’
        the inferred type of pattern :: Foo a -> p at <interactive>:1:1-21
    • Relevant bindings include
        pattern :: Foo a -> p (bound at <interactive>:1:1)
  1. Why is this error happening in the first place? The error message mentions the type Foo a -> p, but in pattern Bar = Nothing, there isn't anything that should touch Foo.

Note that this bug does not occur if a slightly different (but ostensibly equivalent) type signature for Bar is given in the original source file:

{-# LANGUAGE GADTs #-}
{-# LANGUAGE PatternSynonyms #-}
module Works where

data Foo a where
  FooInt :: Foo Int

pattern Bar :: Foo Int
pattern Bar = FooInt
λ> pattern Bar = Nothing
λ> :i Bar
pattern Bar :: Foo Int
Trac metadata
Trac field Value
Version 8.2.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler (Type checker)
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking