Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
jberryman
GHC
Commits
7d8ad026
Commit
7d8ad026
authored
Nov 17, 2009
by
simonpj@microsoft.com
Browse files
Improvement to typecheck higher-rank rules better
See Note [Typechecking rules] in TcRules. Suggested by Roman
parent
0c9282a2
Changes
1
Hide whitespace changes
Inline
Side-by-side
compiler/typecheck/TcRules.lhs
View file @
7d8ad026
...
...
@@ -24,6 +24,22 @@ import Outputable
import FastString
\end{code}
Note [Typechecking rules]
~~~~~~~~~~~~~~~~~~~~~~~~~
We *infer* the typ of the LHS, and use that type to *check* the type of
the RHS. That means that higher-rank rules work reasonably well. Here's
an example (test simplCore/should_compile/rule2.hs) produced by Roman:
foo :: (forall m. m a -> m b) -> m a -> m b
foo f = ...
bar :: (forall m. m a -> m a) -> m a -> m a
bar f = ...
{-# RULES "foo/bar" foo = bar #-}
He wanted the rule to typecheck.
\begin{code}
tcRules :: [LRuleDecl Name] -> TcM [LRuleDecl TcId]
tcRules decls = mapM (wrapLocM tcRule) decls
...
...
@@ -32,15 +48,14 @@ tcRule :: RuleDecl Name -> TcM (RuleDecl TcId)
tcRule (HsRule name act vars lhs fv_lhs rhs fv_rhs)
= addErrCtxt (ruleCtxt name) $ do
traceTc (ptext (sLit "---- Rule ------") <+> ppr name)
rule_ty <- newFlexiTyVarTy openTypeKind
-- Deal with the tyvars mentioned in signatures
(ids, lhs', rhs', lhs_lie, rhs_lie) <-
(ids, lhs', rhs', lhs_lie, rhs_lie
, rule_ty
) <-
tcRuleBndrs vars $ \ ids -> do
-- Now LHS and RHS
(lhs', lhs_lie) <- getLIE (tc
MonoExpr lhs rule_ty
)
-- Now LHS and RHS
; see Note [Typechecking rules]
(
(lhs',
rule_ty),
lhs_lie) <- getLIE (tc
InferRho lhs
)
(rhs', rhs_lie) <- getLIE (tcMonoExpr rhs rule_ty)
return (ids, lhs', rhs', lhs_lie, rhs_lie)
return (ids, lhs', rhs', lhs_lie, rhs_lie
, rule_ty
)
-- Check that LHS has no overloading at all
(lhs_dicts, lhs_binds) <- tcSimplifyRuleLhs lhs_lie
...
...
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment