Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
jberryman
GHC
Commits
b4556cac
Commit
b4556cac
authored
Mar 04, 2010
by
simonpj@microsoft.com
Browse files
Comments only
parent
903f0ad6
Changes
2
Hide whitespace changes
Inline
Side-by-side
compiler/hsSyn/HsExpr.lhs
View file @
b4556cac
...
...
@@ -818,7 +818,7 @@ data StmtLR idL idR
-- The fail operator is noSyntaxExpr
-- if the pattern match can't fail
| ExprStmt (LHsExpr idR)
| ExprStmt (LHsExpr idR)
-- See Note [ExprStmt]
(SyntaxExpr idR) -- The (>>) operator
PostTcType -- Element type of the RHS (used for arrows)
...
...
@@ -845,10 +845,7 @@ data StmtLR idL idR
[LStmt idL] -- Stmts to the *left* of the 'group'
-- which generates the tuples to be grouped
[(idR, idR)] -- After renaming, the IDs are the binders
-- occurring within this transform statement that
-- are used after it which are paired with the
-- names which they group over in statements
[(idR, idR)] -- See Note [GroupStmt binder map]
(Maybe (LHsExpr idR)) -- "by e" (optional)
...
...
@@ -857,7 +854,7 @@ data StmtLR idL idR
(SyntaxExpr idR)) -- Right f => implicit; filled in with 'groupWith'
-- Recursive statement (see Note [RecStmt] below)
-- Recursive statement (see Note [
How
RecStmt
works
] below)
| RecStmt
{ recS_stmts :: [LStmtLR idL idR]
...
...
@@ -892,6 +889,26 @@ data StmtLR idL idR
}
\end{code}
Note [GroupStmt binder map]
~~~~~~~~~~~~~~~~~~~~~~~~~~~
The [(idR,idR)] in a GroupStmt behaves as follows:
* Before renaming: []
* After renaming:
[ (x27,x27), ..., (z35,z35) ]
These are the variables
bound by the stmts to the left of the 'group'
and used either in the 'by' clause,
or in the stmts following the 'group'
Each item is a pair of identical variables.
* After typechecking:
[ (x27:Int, x27:[Int]), ..., (z35:Bool, z35:[Bool]) ]
Each pair has the same unique, but different *types*.
Note [ExprStmt]
~~~~~~~~~~~~~~~
ExprStmts are a bit tricky, because what they mean
depends on the context. Consider the following contexts:
...
...
compiler/typecheck/TcMatches.lhs
View file @
b4556cac
...
...
@@ -441,6 +441,7 @@ tcLcStmt m_tc ctxt (GroupStmt stmts bindersMap by using) elt_ty thing_inside
-- Ensure that every old binder of type b is linked up with its new binder which should have type [b]
; let list_bndr_ids = zipWith mk_list_bndr list_bndr_names bndr_ids
bindersMap' = bndr_ids `zip` list_bndr_ids
-- See Note [GroupStmt binder map] in HsExpr
; using' <- case using of
Left e -> do { e' <- tcPolyExpr e using_ty; return (Left e') }
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment