From 176fb356fbbc4cf398fb66440d84a05ad333c881 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Fri, 11 Aug 2006 14:28:42 +0000 Subject: [PATCH] Complete -fmono-pat-binds patch When adding the experimental -fmono-pat-binds, I forgot to check for type signatures of the now-monomorphic patterns. This patch completes the job. I documented the design too: http://haskell.galois.com/cgi-bin/haskell-prime/trac.cgi/wiki/MonomorphicPatternBindings --- compiler/typecheck/TcBinds.lhs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/compiler/typecheck/TcBinds.lhs b/compiler/typecheck/TcBinds.lhs index e189a98..076de00 100644 --- a/compiler/typecheck/TcBinds.lhs +++ b/compiler/typecheck/TcBinds.lhs @@ -643,9 +643,21 @@ tcLhs sig_fn (FunBind { fun_id = L nm_loc name, fun_infix = inf, fun_matches = m tcLhs sig_fn bind@(PatBind { pat_lhs = pat, pat_rhs = grhss }) = do { mb_sigs <- mapM (tcInstSig_maybe sig_fn) names + ; mono_pat_binds <- doptM Opt_MonoPatBinds + -- With -fmono-pat-binds, we do no generalisation of pattern bindings + -- But the signature can still be polymoprhic! + -- data T = MkT (forall a. a->a) + -- x :: forall a. a->a + -- MkT x = + -- The function get_sig_ty decides whether the pattern-bound variables + -- should have exactly the type in the type signature (-fmono-pat-binds), + -- or the instantiated version (-fmono-pat-binds) ; let nm_sig_prs = names `zip` mb_sigs - tau_sig_env = mkNameEnv [ (name, sig_tau sig) | (name, Just sig) <- nm_sig_prs] + get_sig_ty | mono_pat_binds = idType . sig_id + | otherwise = sig_tau + tau_sig_env = mkNameEnv [ (name, get_sig_ty sig) + | (name, Just sig) <- nm_sig_prs] sig_tau_fn = lookupNameEnv tau_sig_env tc_pat exp_ty = tcPat (LetPat sig_tau_fn) pat exp_ty unitTy $ \ _ -> -- 1.7.10.4