[GHC] #7633: Checkable "minimal complete definitions"
GHC
cvs-ghc at haskell.org
Mon Jan 28 06:10:47 CET 2013
#7633: Checkable "minimal complete definitions"
-----------------------------+----------------------------------------------
Reporter: shachaf | Owner:
Type: feature request | Status: new
Priority: normal | Component: Compiler
Version: 7.6.1 | Keywords:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
Failure: None/Unknown | Blockedby:
Blocking: | Related: 6028
-----------------------------+----------------------------------------------
#6028 suggested warning on cyclic unimplemented defaults. This doesn't
work for the reasons mentioned there, among others (also e.g.
[http://hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html
/Control-Applicative.html#g:2 `Alternative`] has mutually recursive `some`
and `many` methods, which shouldn't be warned about). Figuring out when to
warn automatically seems hard.
But Haskell already has an ad-hoc mechanism for specifying which methods
need to be implemented: A "minimal complete definition" specified in the
comments of almost every class definition that has optional methods.
Unfortunately comments are aren't compiler-checked. It seems that the
simplest solution would be to specify these in a way that the compiler can
understand.
The obvious approach is to add a pragma for it in the class definition. In
particular, one could write a pragma for each "minimal set" of
definitions, and the compiler could warn if none of them are implemented
(and suggest which methods to implement). This lets us keep the
convenience of default method implementations without losing safety.
Without any pragmas, the compiler could fall back to the set "all methods
without defaults", which is what it uses now.
It might look something like this:
{{{
class Functor m => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
m >>= f = join (fmap f m)
join :: m (m a) -> m a
join m = m >>= id
{-# MINIMAL return, join #-}
{-# MINIMAL return, (>>=) #-}
class Eq a where
(==), (/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
{-# MINIMAL (==) #-}
{-# MINIMAL (/=) #-}
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7633>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list