diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2014-12-23 15:39:50 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2014-12-23 16:01:23 +0000 |
commit | a6f0f5ab45b2643b561e0a0a54a4f14745ab2152 (patch) | |
tree | b9b303cd971dc82bf01849de881eff87e1d48ed3 /compiler/basicTypes/Id.hs | |
parent | 625dd7b646d37177731cad20abd4026f2725472f (diff) | |
download | haskell-a6f0f5ab45b2643b561e0a0a54a4f14745ab2152.tar.gz |
Eliminate so-called "silent superclass parameters"
The purpose of silent superclass parameters was to solve the
awkward problem of superclass dictinaries being bound to bottom.
See THE PROBLEM in Note [Recursive superclasses] in TcInstDcls
Although the silent-superclass idea worked,
* It had non-local consequences, and had effects even in Haddock,
where we had to discard silent parameters before displaying
instance declarations
* It had unexpected peformance costs, shown up by Trac #3064 and its
test case. In monad-transformer code, when constructing a Monad
dictionary you had to pass an Applicative dictionary; and to
construct that you neede a Functor dictionary. Yet these extra
dictionaries were often never used. (All this got much worse when
we added Applicative as a superclass of Monad.) Test T3064
compiled *far* faster after silent superclasses were eliminated.
* It introduced new bugs. For example SilentParametersOverlapping,
T5051, and T7862, all failed to compile because of instance overlap
directly because of the silent-superclass trick.
So this patch takes a new approach, which I worked out with Dimitrios
in the closing hours before Christmas. It is described in detail
in THE PROBLEM in Note [Recursive superclasses] in TcInstDcls.
Seems to work great!
Quite a bit of knock-on effect
* The main implementation work is in tcSuperClasses in TcInstDcls
Everything else is fall-out
* IdInfo.DFunId no longer needs its n-silent argument
* Ditto IDFunId in IfaceSyn
* Hence interface file format changes
* Now that DFunIds do not have silent superclass parameters, printing
out instance declarations is simpler. There is tiny knock-on effect
in Haddock, so that submodule is updated
* I realised that when computing the "size of a dictionary type"
in TcValidity.sizePred, we should be rather conservative about
type functions, which can arbitrarily increase the size of a type.
Hence the new datatype TypeSize, which has a TSBig constructor for
"arbitrarily big".
* instDFunType moves from TcSMonad to Inst
* Interestingly, CmmNode and CmmExpr both now need a non-silent
(Ord r) in a couple of instance declarations. These were previously
silent but must now be explicit.
* Quite a bit of wibbling in error messages
Diffstat (limited to 'compiler/basicTypes/Id.hs')
-rw-r--r-- | compiler/basicTypes/Id.hs | 7 |
1 files changed, 1 insertions, 6 deletions
diff --git a/compiler/basicTypes/Id.hs b/compiler/basicTypes/Id.hs index ccd6c9b494..3e6473ff6e 100644 --- a/compiler/basicTypes/Id.hs +++ b/compiler/basicTypes/Id.hs @@ -61,7 +61,7 @@ module Id ( hasNoBinding, -- ** Evidence variables - DictId, isDictId, dfunNSilent, isEvVar, + DictId, isDictId, isEvVar, -- ** Inline pragma stuff idInlinePragma, setInlinePragma, modifyInlinePragma, @@ -392,11 +392,6 @@ isDFunId id = case Var.idDetails id of DFunId {} -> True _ -> False -dfunNSilent :: Id -> Int -dfunNSilent id = case Var.idDetails id of - DFunId ns _ -> ns - _ -> pprPanic "dfunSilent: not a dfun:" (ppr id) - isPrimOpId_maybe id = case Var.idDetails id of PrimOpId op -> Just op _ -> Nothing |