[commit: ghc] wip/pattern-synonyms: Typechecker support for explicitly-bidirectional pattern synonyms (e5dd0bf)
git at git.haskell.org
git at git.haskell.org
Tue Jul 8 12:25:54 UTC 2014
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/pattern-synonyms
Link : http://ghc.haskell.org/trac/ghc/changeset/e5dd0bf57be2ed630b102e5e34cbdf4fce964f11/ghc
>---------------------------------------------------------------
commit e5dd0bf57be2ed630b102e5e34cbdf4fce964f11
Author: Dr. ERDI Gergo <gergo at erdi.hu>
Date: Sun Jul 6 23:49:43 2014 +0800
Typechecker support for explicitly-bidirectional pattern synonyms
>---------------------------------------------------------------
e5dd0bf57be2ed630b102e5e34cbdf4fce964f11
compiler/typecheck/TcPatSyn.lhs | 39 +++++++++++++++++++++++----------------
1 file changed, 23 insertions(+), 16 deletions(-)
diff --git a/compiler/typecheck/TcPatSyn.lhs b/compiler/typecheck/TcPatSyn.lhs
index 82fa999..d72acba 100644
--- a/compiler/typecheck/TcPatSyn.lhs
+++ b/compiler/typecheck/TcPatSyn.lhs
@@ -205,16 +205,27 @@ tcPatSynWrapper lname lpat dir args univ_tvs ex_tvs theta pat_ty
(ImplicitBidirectional, Nothing) ->
cannotInvertPatSynErr lpat
(ImplicitBidirectional, Just lexpr) ->
- fmap Just $ tc_pat_syn_wrapper_from_expr lname lexpr args univ_tvs ex_tvs theta pat_ty }
-
-tc_pat_syn_wrapper_from_expr :: Located Name
- -> LHsExpr Name
- -> [Var]
- -> [TyVar] -> [TyVar]
- -> ThetaType
- -> Type
- -> TcM (Id, LHsBinds Id)
-tc_pat_syn_wrapper_from_expr (L loc name) lexpr args univ_tvs ex_tvs theta pat_ty
+ fmap Just $ mkWrapper $ \wrapper_lname args' ->
+ do { let wrapper_args = map (noLoc . VarPat . Var.varName) args'
+ wrapper_match = mkMatch wrapper_args lexpr EmptyLocalBinds
+ bind = mkTopFunBind Generated wrapper_lname [wrapper_match]
+ ; return bind }
+ (ExplicitBidirectional mg, _) ->
+ fmap Just $ mkWrapper $ \wrapper_lname _args' ->
+ return FunBind{ fun_id = wrapper_lname
+ , fun_infix = False
+ , fun_matches = mg
+ , fun_co_fn = idHsWrapper
+ , bind_fvs = placeHolderNames
+ , fun_tick = Nothing } }
+ where
+ mkWrapper = mkPatSynWrapper lname args univ_tvs ex_tvs theta pat_ty
+
+mkPatSynWrapper :: Located Name
+ -> [Var] -> [TyVar] -> [TyVar] -> ThetaType -> Type
+ -> (Located Name -> [Var] -> TcM (HsBind Name))
+ -> TcM (Id, LHsBinds Id)
+mkPatSynWrapper (L loc name) args univ_tvs ex_tvs theta pat_ty mk_bind
= do { let qtvs = univ_tvs ++ ex_tvs
; (subst, wrapper_tvs) <- tcInstSkolTyVars qtvs
; let wrapper_theta = substTheta subst theta
@@ -227,21 +238,17 @@ tc_pat_syn_wrapper_from_expr (L loc name) lexpr args univ_tvs ex_tvs theta pat_t
; let wrapper_lname = L loc wrapper_name
wrapper_id = mkExportedLocalId VanillaId wrapper_name wrapper_sigma
- ; let wrapper_args = map (noLoc . VarPat . Var.varName) args'
- wrapper_match = mkMatch wrapper_args lexpr EmptyLocalBinds
- bind = mkTopFunBind Generated wrapper_lname [wrapper_match]
- lbind = noLoc bind
+ ; bind <- mk_bind wrapper_lname args'
; let sig = TcSigInfo{ sig_id = wrapper_id
, sig_tvs = map (\tv -> (Nothing, tv)) wrapper_tvs
, sig_theta = wrapper_theta
, sig_tau = wrapper_tau
, sig_loc = loc
}
- ; (wrapper_binds, _, _) <- tcPolyCheck NonRecursive (const []) sig lbind
+ ; (wrapper_binds, _, _) <- tcPolyCheck NonRecursive (const []) sig (noLoc bind)
; traceTc "tcPatSynDecl wrapper" $ ppr wrapper_binds
; traceTc "tcPatSynDecl wrapper type" $ ppr (varType wrapper_id)
; return (wrapper_id, wrapper_binds) }
-
\end{code}
Note [As-patterns in pattern synonym definitions]
More information about the ghc-commits
mailing list