Skip to content

Cannot pacify -Wmonomorphism-restriction with nested pattern bindings

I originally observed this issue in the parsers library. Here's a minimal example:

{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wmonomorphism-restriction #-}
module Bug where

class Monad m => C m where
  c :: (m Char, m Char)

foo :: forall m. C m => m Char
foo = bar >> baz
  where
    (bar, baz) = c

If you compile this with a GHC that supports -Wmonomorphism-restriction (GHC 8.0.1 or later), it'll rightfully give this warning:

[1 of 1] Compiling Bug              ( Bug.hs, interpreted )

Bug.hs:11:5: warning: [-Wmonomorphism-restriction]
    • The Monomorphism Restriction applies to the bindings for ‘bar’,
                                                               ‘baz’
        Consider giving a type signature for these binders
    • In an equation for ‘foo’:
          foo
            = bar >> baz
            where
                (bar, baz) = c
   |
11 |     (bar, baz) = c
   |     ^^^^^^^^^^^^^^

Naturally, I tried to squelch this warning by adding type signatures for bar and baz:

foo :: forall m. C m => m Char
foo = bar >> baz
  where
    bar, baz :: m Char
    (bar, baz) = c

But GHC //still// warns!

[1 of 1] Compiling Bug              ( Bug.hs, interpreted )

Bug.hs:12:5: warning: [-Wmonomorphism-restriction]
    • The Monomorphism Restriction applies to the bindings for ‘bar’,
                                                               ‘baz’
        Consider giving a type signature for these binders
    • In an equation for ‘foo’:
          foo
            = bar >> baz
            where
                bar, baz :: m Char
                (bar, baz) = c
   |
12 |     (bar, baz) = c
   |     ^^^^^^^^^^^^^^

And to make things even more absurd, GHC points out a chunk of code which //has// type signatures :)

Trac metadata
Trac field Value
Version 8.0.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