Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
GHC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Model registry
Operate
Terraform modules
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Andrea Bedini
GHC
Commits
901f574d
Commit
901f574d
authored
16 years ago
by
Simon Peyton Jones
Browse files
Options
Downloads
Patches
Plain Diff
Simplify the type signature for tcPolyBinds
parent
6c1dbaa6
Loading
Loading
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
compiler/typecheck/TcBinds.lhs
+30
-23
30 additions, 23 deletions
compiler/typecheck/TcBinds.lhs
compiler/typecheck/TcClassDcl.lhs
+1
-1
1 addition, 1 deletion
compiler/typecheck/TcClassDcl.lhs
with
31 additions
and
24 deletions
compiler/typecheck/TcBinds.lhs
+
30
−
23
View file @
901f574d
...
...
@@ -203,15 +203,19 @@ tc_group _ top_lvl sig_fn prag_fn (NonRecursive, binds) thing_inside
-- A single non-recursive binding
-- We want to keep non-recursive things non-recursive
-- so that we desugar unlifted bindings correctly
= do { (binds, thing) <- tc_haskell98 top_lvl sig_fn prag_fn NonRecursive binds thing_inside
; return ([(NonRecursive, b) | b <- binds], thing) }
= do { (binds1, lie_binds, thing) <- tc_haskell98 top_lvl sig_fn prag_fn
NonRecursive binds thing_inside
; return ( [(NonRecursive, unitBag b) | b <- bagToList binds1]
++ [(Recursive, lie_binds)] -- TcDictBinds have scrambled dependency order
, thing) }
tc_group poly_rec top_lvl sig_fn prag_fn (Recursive, binds) thing_inside
| not poly_rec -- Recursive group, normal Haskell 98 route
= do { (binds1, thing) <- tc_haskell98 top_lvl sig_fn prag_fn Recursive binds thing_inside
; return ([(Recursive, unionManyBags binds1)], thing) }
= do { (binds1, lie_binds, thing) <- tc_haskell98 top_lvl sig_fn prag_fn
Recursive binds thing_inside
; return ([(Recursive, binds1 `unionBags` lie_binds)], thing) }
| otherwise -- Recursive group, with
gla-exts
| otherwise -- Recursive group, with
-XRelaxedPolyRec
= -- To maximise polymorphism (with -XRelaxedPolyRec), we do a new
-- strongly-connected-component analysis, this time omitting
-- any references to variables with type signatures.
...
...
@@ -219,16 +223,16 @@ tc_group poly_rec top_lvl sig_fn prag_fn (Recursive, binds) thing_inside
-- Notice that the bindInsts thing covers *all* the bindings in
-- the original group at once; an earlier one may use a later one!
do { traceTc (text "tc_group rec" <+> pprLHsBinds binds)
; (binds1,thing) <- bindLocalInsts top_lvl $
; (binds1,
lie_binds,
thing) <- bindLocalInsts top_lvl $
go (stronglyConnCompFromEdgedVertices (mkEdges sig_fn binds))
; return ([(Recursive,
unionManyBags
binds
1
)], thing) }
; return ([(Recursive,
binds1 `unionBags` lie_
binds)], thing) }
-- Rec them all together
where
-- go :: SCC (LHsBind Name) -> TcM (
[
LHsBind TcId
]
, [TcId], thing)
-- go :: SCC (LHsBind Name) -> TcM (LHsBind
s
TcId, [TcId], thing)
go (scc:sccs) = do { (binds1, ids1) <- tc_scc scc
; (binds2, ids2, thing) <- tcExtendIdEnv ids1 $ go sccs
; return (binds1
++
binds2, ids1 ++ ids2, thing) }
go [] = do { thing <- thing_inside; return (
[]
, [], thing) }
; return (binds1
`unionBags`
binds2, ids1 ++ ids2, thing) }
go [] = do { thing <- thing_inside; return (
emptyBag
, [], thing) }
tc_scc (AcyclicSCC bind) = tc_sub_group NonRecursive (unitBag bind)
tc_scc (CyclicSCC binds) = tc_sub_group Recursive (listToBag binds)
...
...
@@ -236,17 +240,20 @@ tc_group poly_rec top_lvl sig_fn prag_fn (Recursive, binds) thing_inside
tc_sub_group = tcPolyBinds top_lvl sig_fn prag_fn Recursive
tc_haskell98 :: TopLevelFlag -> TcSigFun -> TcPragFun -> RecFlag
-> LHsBinds Name -> TcM a -> TcM (
[
LHsBinds TcId
]
, a)
-> LHsBinds Name -> TcM a -> TcM (LHsBinds TcId
, TcDictBinds
, a)
tc_haskell98 top_lvl sig_fn prag_fn rec_flag binds thing_inside
= bindLocalInsts top_lvl $
do
{ (binds1, ids) <- tcPolyBinds top_lvl sig_fn prag_fn rec_flag rec_flag binds
; thing <- tcExtendIdEnv ids thing_inside
; return (binds1, ids, thing) }
= bindLocalInsts top_lvl $
do
{ (binds1, ids) <- tcPolyBinds top_lvl sig_fn prag_fn rec_flag rec_flag binds
; thing <- tcExtendIdEnv ids thing_inside
; return (binds1, ids, thing) }
------------------------
bindLocalInsts :: TopLevelFlag -> TcM ([LHsBinds TcId], [TcId], a) -> TcM ([LHsBinds TcId], a)
bindLocalInsts :: TopLevelFlag
-> TcM (LHsBinds TcId, [TcId], a)
-> TcM (LHsBinds TcId, TcDictBinds, a)
bindLocalInsts top_lvl thing_inside
| isTopLevel top_lvl = do { (binds, _, thing) <- thing_inside; return (binds, thing) }
| isTopLevel top_lvl
= do { (binds, _, thing) <- thing_inside; return (binds, emptyBag, thing) }
-- For the top level don't bother with all this bindInstsOfLocalFuns stuff.
-- All the top level things are rec'd together anyway, so it's fine to
-- leave them to the tcSimplifyTop, and quite a bit faster too
...
...
@@ -254,7 +261,7 @@ bindLocalInsts top_lvl thing_inside
| otherwise -- Nested case
= do { ((binds, ids, thing), lie) <- getLIE thing_inside
; lie_binds <- bindInstsOfLocalFuns lie ids
; return (binds
++ [
lie_binds
]
, thing) }
; return (binds
,
lie_binds, thing) }
------------------------
mkEdges :: TcSigFun -> LHsBinds Name
...
...
@@ -289,7 +296,7 @@ tcPolyBinds :: TopLevelFlag -> TcSigFun -> TcPragFun
-> RecFlag -- Whether it's recursive after breaking
-- dependencies based on type signatures
-> LHsBinds Name
-> TcM (
[
LHsBinds TcId
]
, [TcId])
-> TcM (LHsBinds TcId, [TcId])
-- Typechecks a single bunch of bindings all together,
-- and generalises them. The bunch may be only part of a recursive
...
...
@@ -334,7 +341,7 @@ tcPolyBinds top_lvl sig_fn prag_fn rec_group rec_tc binds
mk_export (_, Just sig, mono_id) _ = ([], sig_id sig, mono_id, [])
-- ToDo: prags for unlifted bindings
; return (
[
unitBag $ L loc $ AbsBinds [] [] exports binds'
]
,
; return ( unitBag $ L loc $ AbsBinds [] [] exports binds',
[poly_id | (_, poly_id, _, _) <- exports]) } -- Guaranteed zonked
else do -- The normal lifted case: GENERALISE
...
...
@@ -355,7 +362,7 @@ tcPolyBinds top_lvl sig_fn prag_fn rec_group rec_tc binds
dict_vars exports
(dict_binds `unionBags` binds')
; return (
[
unitBag abs_bind
]
, poly_ids) -- poly_ids are guaranteed zonked by mkExport
; return (unitBag abs_bind, poly_ids) -- poly_ids are guaranteed zonked by mkExport
} }
...
...
@@ -439,11 +446,11 @@ tcSpecPrag poly_id hs_ty inl
-- signature-less binder given type (forall a.a), to minimise
-- subsequent error messages
recoveryCode :: [Name] -> (Name -> Maybe [Name])
-> TcM
([Bag
(LHsBind
LR Id Var)]
, [Id])
-> TcM (LHsBind
s TcId
, [Id])
recoveryCode binder_names sig_fn
= do { traceTc (text "tcBindsWithSigs: error recovery" <+> ppr binder_names)
; poly_ids <- mapM mk_dummy binder_names
; return (
[]
, poly_ids) }
; return (
emptyBag
, poly_ids) }
where
mk_dummy name
| isJust (sig_fn name) = tcLookupId name -- Had signature; look it up
...
...
This diff is collapsed.
Click to expand it.
compiler/typecheck/TcClassDcl.lhs
+
1
−
1
View file @
901f574d
...
...
@@ -271,7 +271,7 @@ tcMethodBind tyvars prags meth_id bind
(unitBag bind)
; ASSERT( ids == [meth_id] ) -- Binding for ONE method
return
(unionManyBags
tc_binds
)
}
return tc_binds }
\end{code}
Note [Polymorphic methods]
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment