[GHC] #10959: MINIMAL pragma and default implementations

GHC ghc-devs at haskell.org
Mon Oct 12 13:10:48 UTC 2015


#10959: MINIMAL pragma and default implementations
-------------------------------------+-------------------------------------
        Reporter:  basvandijk        |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  Other             |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by rwbarton):

 {{{
 {-# LANGUAGE DefaultSignatures #-}

 module Min where
 class C a where
   meth :: a -> a
   {-# MINIMAL meth #-}

   default meth :: Enum a => a -> a
   meth = succ

 instance C Int
 {-
 Min.hs:11:10: Warning:
     No explicit implementation for
       ‘meth’
     In the instance declaration for ‘C Int’
 -}
 }}}
 It's true there is no ''explicit'' implementation, but surely the
 intention of the MINIMAL pragma was to warn if we end up with the `meth =
 error "..."` implementation that the compiler would supply if there was no
 other implementation at all. If we end up using the default implementation
 `meth = succ` then it should count towards satisfying the MINIMAL pragma.

 Incidentally, as I just discovered in testing, the MINIMAL pragma is
 totally useless in this case: if you don't include an implementation for
 `meth` in an instance for `C`, ghc will try to use the default
 implementation, and if it doesn't type check (if there is no instance of
 `Enum`), that's an error; it doesn't fall back on the `meth = error "..."`
 implementation for a missing method. So there is no way you can ever not
 have an implementation for `meth`. (That's not how I thought it worked; I
 thought the default implementation would just be ignored if it doesn't
 type check. But it is consistent with the documentation. `default meth ::
 Enum a => a -> a` is a type signature on ''the'' default implementation,
 not a description of when to provide ''a'' default implementation.)

 So I guess an even more minimal example would be
 {{{
 module Min where
 class C a where
   meth :: a -> a
   meth = id
   {-# MINIMAL meth #-}

 instance C Int
 {-
 Min.hs:7:10: Warning:
     No explicit implementation for
       ‘meth’
     In the instance declaration for ‘C Int’
 -}
 }}}
 and now I've convinced myself that there is no bug here at all, just wrong
 use of MINIMAL. A correct use in conjunction with DefaultSignatures would
 be if you had two methods in a class, each with a default implementation
 (using DefaultSignatures) in terms of the other. Then the default
 implementations should not count for satisfying MINIMAL!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10959#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list