 11 Nov, 2015 1 commit


Alan Zimmerman authored
One of the changes D538 introduced is to add `m_fun_id_infix` to `Match` ```lang=hs data Match id body = Match { m_fun_id_infix :: (Maybe (Located id,Bool)),  fun_id and fun_infix for functions with multiple equations  only present for a RdrName. See note [fun_id in Match] m_pats :: [LPat id],  The patterns m_type :: (Maybe (LHsType id)),  A type signature for the result of the match  Nothing after typechecking m_grhss :: (GRHSs id body) } deriving (Typeable) ``` This was done to track the individual locations and fixity of the `fun_id` for each of the defining equations for a function when there are more than one. For example, the function `(&&&)` is defined with some prefix and some infix equations below. ```lang=hs (&&& ) [] [] = [] xs &&& [] = xs ( &&& ) [] ys = ys ``` This means that the fun_infix is now superfluous in the `FunBind`. This has not been removed as a potentially risky change just before 7.10 RC2, and so must be done after. This ticket captures that task, which includes processing these fields through the renamer and beyond. Ticket #9988 introduced these fields into `Match` through renaming, this ticket it to continue through type checking and then remove it from `FunBind` completely. The split happened so that #9988 could land in 7.10 Trac ticket : #10061 Test Plan: ./validate Reviewers: goldfire, austin, simonpj, bgamari Reviewed By: bgamari Subscribers: simonpj, thomie, mpickering Differential Revision: https://phabricator.haskell.org/D1285 GHC Trac Issues: #10061

 03 Dec, 2014 1 commit


Austin Seipp authored
Signedoffby: Austin Seipp <austin@welltyped.com>

 03 Oct, 2012 1 commit


Simon Peyton Jones authored
All the work was done by Dan WinogradCort. The main thing is that arrow comamnds now have their own data type HsCmd (defined in HsExpr). Previously it was punned with the HsExpr type, which was jolly confusing, and made it hard to do anything arrowspecific. To make this work, we now parameterise * MatchGroup * Match * GRHSs, GRHS * StmtLR and friends over the "body", that is the kind of thing they enclose. This "body" parameter can be instantiated to either LHsExpr or LHsCmd respectively. Everything else is really a knockon effect; there should be no change (yet!) in behaviour. But it should be a sounder basis for fixing bugs.

 26 Jan, 2012 1 commit


Ian Lynagh authored

 05 Dec, 2011 1 commit


Simon Peyton Jones authored
The main idea is that when we unify forall a. t1 ~ forall a. t2 we get constraints from unifying t1~t2 that mention a. We are producing a coercion witnessing the equivalence of the foralls, and inside *that* coercion we need bindings for the solved constraints arising from t1~t2. We didn't have way to do this before. The big change is that here's a new type TcEvidence.TcCoercion, which is much like Coercion.Coercion except that there's a slot for TcEvBinds in it. This has a wave of followon changes. Not deep but broad. * New module TcEvidence, which now contains the HsWrapper TcEvBinds, EvTerm etc types that used to be in HsBinds * The typechecker works exclusively in terms of TcCoercion. * The desugarer converts TcCoercion to Coercion * The main payload is in TcUnify.unifySigmaTy. This is the function that had a gross hack before, but is now beautiful. * LCoercion is gone! Hooray. Many many fiddly changes in conssequence. But it's nice.

 04 Nov, 2011 1 commit


Ian Lynagh authored
We only use it for "compiler" sources, i.e. not for libraries. Many modules have a fnowarntabs kludge for now.

 13 Sep, 2010 1 commit


simonpj@microsoft.com authored
This major patch implements the new OutsideIn constraint solving algorithm in the typecheker, following our JFP paper "Modular type inference with local assumptions". Done with major help from Dimitrios Vytiniotis and Brent Yorgey.

 22 Aug, 2007 1 commit


simonpj@microsoft.com authored

 29 Sep, 2006 1 commit


simonpj@microsoft.com authored

 17 Aug, 2006 1 commit


simonpj@microsoft.com authored
A consequence of my recent meddling with hsboot files is that GHC is more picky about the correpondence between the hsboot file and the hs file. In particular, you must use the same type synonyms. This patche fixes up GHC's own hsboot files to match the restriction.

 07 Apr, 2006 1 commit


Simon Marlow authored
Most of the other users of the fptools build system have migrated to Cabal, and with the move to darcs we can now flatten the source tree without losing history, so here goes. The main change is that the ghc/ subdir is gone, and most of what it contained is now at the top level. The build system now makes no pretense at being multiproject, it is just the GHC build system. No doubt this will break many things, and there will be a period of instability while we fix the dependencies. A straightforward build should work, but I haven't yet fixed binary/source distributions. Changes to the Building Guide will follow, too.

 25 Jan, 2006 1 commit


simonpj@microsoft.com authored
This very large commit adds impredicativity to GHC, plus numerous other small things. *** WARNING: I have compiled all the libraries, and *** a stage2 compiler, and everything seems *** fine. But don't grab this patch if you *** can't tolerate a hiccup if something is *** broken. The big picture is this: a) GHC handles impredicative polymorphism, as described in the "Boxy types: type inference for higherrank types and impredicativity" paper b) GHC handles GADTs in the new simplified (and very sligtly less epxrssive) way described in the "Simple unificationbased type inference for GADTs" paper But there are lots of smaller changes, and since it was preDarcs they are not individually recorded. Some things to watch out for: c) The story on lexicallyscoped type variables has changed, as per my email. I append the story below for completeness, but I am still not happy with it, and it may change again. In particular, the new story does not allow a patternbound scoped type variable to be wobbly, so (\(x::[a]) > ...) is usually rejected. This is more restrictive than before, and we might loosen up again. d) A consequence of adding impredicativity is that GHC is a bit less gung ho about converting automatically between (ty1 > forall a. ty2) and (forall a. ty1 > ty2) In particular, you may need to etaexpand some functions to make typechecking work again. Furthermore, functions are now invariant in their argument types, rather than being contravariant. Again, the main consequence is that you may occasionally need to etaexpand function arguments when using higherrank polymorphism. Please test, and let me know of any hiccups Scoped type variables in GHC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ January 2006 0) Terminology. A *pattern binding* is of the form pat = rhs A *function binding* is of the form f pat1 .. patn = rhs A binding of the formm var = rhs is treated as a (degenerate) *function binding*. A *declaration type signature* is a separate type signature for a letbound or wherebound variable: f :: Int > Int A *pattern type signature* is a signature in a pattern: \(x::a) > x f (x::a) = x A *result type signature* is a signature on the result of a function definition: f :: forall a. [a] > a head (x:xs) :: a = x The form x :: a = rhs is treated as a (degnerate) function binding with a result type signature, not as a pattern binding. 1) The main invariants: A) A lexicallyscoped type variable always names a (rigid) type variable (not an arbitrary type). THIS IS A CHANGE. Previously, a scoped type variable named an arbitrary *type*. B) A type signature always describes a rigid type (since its free (scoped) type variables name rigid type variables). This is also a change, a consequence of (A). C) Distinct lexicallyscoped type variables name distinct rigid type variables. This choice is open; 2) Scoping 2(a) If a declaration type signature has an explicit forall, those type variables are brought into scope in the right hand side of the corresponding binding (plus, for function bindings, the patterns on the LHS). f :: forall a. a > [a] f (x::a) = [x :: a, x] Both occurences of 'a' in the second line are bound by the 'forall a' in the first line A declaration type signature *without* an explicit toplevel forall is implicitly quantified over all the type variables that are mentioned in the type but not already in scope. GHC's current rule is that this implicit quantification does *not* bring into scope any new scoped type variables. f :: a > a f x = ...('a' is not in scope here)... This gives compatibility with Haskell 98 2(b) A pattern type signature implicitly brings into scope any type variables mentioned in the type that are not already into scope. These are called *patternbound type variables*. g :: a > a > [a] g (x::a) (y::a) = [y :: a, x] The pattern type signature (x::a) brings 'a' into scope. The 'a' in the pattern (y::a) is bound, as is the occurrence on the RHS. A pattern type siganture is the only way you can bring existentials into scope. data T where MkT :: forall a. a > (a>Int) > T f x = case x of MkT (x::a) f > f (x::a) 2a) QUESTION class C a where op :: forall b. b>a>a instance C (T p q) where op = <rhs> Clearly p,q are in scope in <rhs>, but is 'b'? Not at the moment. Nor can you add a type signature for op in the instance decl. You'd have to say this: instance C (T p q) where op = let op' :: forall b. ... op' = <rhs> in op' 3) A patternbound type variable is allowed only if the pattern's expected type is rigid. Otherwise we don't know exactly *which* skolem the scoped type variable should be bound to, and that means we can't do GADT refinement. This is invariant (A), and it is a big change from the current situation. f (x::a) = x  NO; pattern type is wobbly g1 :: b > b g1 (x::b) = x  YES, because the pattern type is rigid g2 :: b > b g2 (x::c) = x  YES, same reason h :: forall b. b > b h (x::b) = x  YES, but the inner b is bound k :: forall b. b > b k (x::c) = x  NO, it can't be both b and c 3a) You cannot give different names for the same type variable in the same scope (Invariant (C)): f1 :: p > p > p  NO; because 'a' and 'b' would be f1 (x::a) (y::b) = (x::a)  bound to the same type variable f2 :: p > p > p  OK; 'a' is bound to the type variable f2 (x::a) (y::a) = (x::a)  over which f2 is quantified  NB: 'p' is not lexically scoped f3 :: forall p. p > p > p  NO: 'p' is now scoped, and is bound to f3 (x::a) (y::a) = (x::a)  to the same type varialble as 'a' f4 :: forall p. p > p > p  OK: 'p' is now scoped, and its occurences f4 (x::p) (y::p) = (x::p)  in the patterns are bound by the forall 3b) You can give a different name to the same type variable in different disjoint scopes, just as you can (if you want) give diferent names to the same value parameter g :: a > Bool > Maybe a g (x::p) True = Just x :: Maybe p g (y::q) False = Nothing :: Maybe q 3c) Scoped type variables respect alpha renaming. For example, function f2 from (3a) above could also be written: f2' :: p > p > p f2' (x::b) (y::b) = x::b where the scoped type variable is called 'b' instead of 'a'. 4) Result type signatures obey the same rules as pattern types signatures. In particular, they can bind a type variable only if the result type is rigid f x :: a = x  NO g :: b > b g x :: b = x  YES; binds b in rhs 5) A *pattern type signature* in a *pattern binding* cannot bind a scoped type variable (x::a, y) = ...  Legal only if 'a' is already in scope Reason: in type checking, the "expected type" of the LHS pattern is always wobbly, so we can't bind a rigid type variable. (The exception would be for an existential type variable, but existentials are not allowed in pattern bindings either.) Even this is illegal f :: forall a. a > a f x = let ((y::b)::a, z) = ... in Here it looks as if 'b' might get a rigid binding; but you can't bind it to the same skolem as a. 6) Explicitlyforall'd type variables in the *declaration type signature(s)* for a *pattern binding* do not scope AT ALL. x :: forall a. a>a  NO; the forall a does Just (x::a>a) = Just id  not scope at all y :: forall a. a>a Just y = Just (id :: a>a)  NO; same reason THIS IS A CHANGE, but one I bet that very few people will notice. Here's why: strange :: forall b. (b>b,b>b) strange = (id,id) x1 :: forall a. a>a y1 :: forall b. b>b (x1,y1) = strange This is legal Haskell 98 (modulo the forall). If both 'a' and 'b' both scoped over the RHS, they'd get unified and so cannot stand for distinct type variables. One could *imagine* allowing this: x2 :: forall a. a>a y2 :: forall a. a>a (x2,y2) = strange using the very same type variable 'a' in both signatures, so that a single 'a' scopes over the RHS. That seems defensible, but odd, because though there are two type signatures, they introduce just *one* scoped type variable, a. 7) Possible extension. We might consider allowing \(x :: [ _ ]) > <expr> where "_" is a wild card, to mean "x has type list of something", without naming the something.

 27 Jan, 2005 1 commit


simonpj authored
 Replace hiboot files with hsboot files  This major commit completely reorganises the way that recursive modules are dealt with. * It should have NO EFFECT if you do not use recursive modules * It is a BREAKING CHANGE if you do ====== Warning: .hifile format has changed, so if you are ====== updating into an existing HEAD build, you'll ====== need to make clean and remake The details: [documentation still to be done] * Recursive loops are now broken with Foo.hsboot (or Foo.lhsboot), not Foo.hiboot * An hsboot files is a proper source file. It is compiled just like a regular Haskell source file: ghc Foo.hs generates Foo.hi, Foo.o ghc Foo.hsboot generates Foo.hiboot, Foo.oboot * hsboot files are precisely a subset of Haskell. In particular:  they have the same import, export, and scoping rules  errors (such as kind errors) in hsboot files are checked You do *not* need to mention the "original" name of something in an hsboot file, any more than you do in any other Haskell module. * The Foo.hiboot file generated by compiling Foo.hsboot is a machine generated interface file, in precisely the same format as Foo.hi * When compiling Foo.hs, its exports are checked for compatibility with Foo.hiboot (previously generated by compiling Foo.hsboot) * The dependency analyser (ghc M) knows about Foo.hsboot files, and generates appropriate dependencies. For regular source files it generates Foo.o : Foo.hs Foo.o : Baz.hi  Foo.hs imports Baz Foo.o : Bog.hiboot  Foo.hs sourceimports Bog For a hsboot file it generates similar dependencies Bog.oboot : Bog.hsboot Bog.oboot : Nib.hi  Bog.hsboto imports Nib * ghc M is also enhanced to use the compilation manager dependency chasing, so that ghc M Main will usually do the job. No need to enumerate all the source files. * The c flag is no longer a "compiler mode". It simply means "omit the link step", and synonymous with nolink.
