[Haskell-cafe] GHCi infers a type but refuses it as type signature
wren ng thornton
wren at freegeek.org
Wed Jun 24 22:35:36 EDT 2009
Luke Palmer wrote:
> On Tue, Jun 23, 2009 at 2:20 AM, <papa.eric at free.fr> wrote:
>>> Simple: the definition of MonadState uses those extensions.
>> Thanks, yes it helps and explains all. :^)
>> I suppose then that if -XFlexibleContexts is indeed required by the
>> standard libraries, it is a "safe" extension, meaning supported by all
>> compilers? Are many such extensions de-facto standard that anyone can enable
>> by default?
> Now to answer your question, with 50% less idealistic ranting!
> There is definitely a canon of "safe" extensions in the community.
> Hierarchical libraries (that's not even an -X flag, it's just on),
> multiparam typeclasses, fundeps are among them. I can't say whether
> FlexibleContexts is.
I wouldn't say that fundeps are "safe". They're well supported on GHC
and Hugs, but they're hard to implement and can be tricky to reason
about. Also the haskell' committee isn't too fond of them.
Hierarchical modules and the FFI are "safe" in that they're really old
amendments to the H98 report; so they're as good as H98 for most folks.
CPP isn't blessed thus, but it's ubiquitous and easy to support. It's
worth noting here that most Haskell compilers other than GHC and Hugs
don't have full H98 support (even though that is the goal).
Other extensions which shouldn't cause anyone to bat an eyelash are
TypeSynonymInstances, FlexibleContexts, FlexibleInstances,
NoMonomorphismRestriction, NoImplicitPrelude. Some of these only make
sense with MPTCs. MPTCs may cause certain folks to bat an eyelash (once)
because they're flagrantly non-H98 and aren't widely supported; but they
are widely used, most implementations want them, and haskell' likes
them. The Flexible* extensions are almost required to make interesting
use of MPTCs.
The OverlappingInstances extension should make one wonder if there's a
better way to implement things, but it's supported by both Hugs and GHC
and it can make MPTCs do some really fun things. If you start needing
IncoherentInstances, then you should become concerned and start looking
for another way.
Rank2Types, RankNTypes, ExistentialQuantification, ScopedTypeVariables,
and GADTs are fairly benign ---though this is where you start loosing
compatibility with non-GHC compilers. Arrows would be benign except that
the syntax keeps changing. Fundeps are also in this category I'd say:
not widely supported, but fairly well known. UndecidableInstances could
also go here, though it should always make one cautious.
Anything else (TypeFamilies, TemplateHaskell,...) puts you firmly in
GHC-only land which is perilous to portability/maintainability.
More information about the Haskell-Cafe