2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[TcGRHSs]{Typecheck guarded right-hand-sides}
7 #include "HsVersions.h"
9 module TcGRHSs ( tcGRHSsAndBinds ) where
12 IMPORT_DELOOPER(TcLoop) -- for paranoia checking
14 import HsSyn ( GRHSsAndBinds(..), GRHS(..),
15 HsExpr, HsBinds(..), InPat, OutPat, Bind, Sig, Fake )
16 import RnHsSyn ( RenamedGRHSsAndBinds(..), RenamedGRHS(..) )
17 import TcHsSyn ( TcGRHSsAndBinds(..), TcGRHS(..), TcIdOcc(..) )
19 import TcMonad hiding ( rnMtoTcM )
20 import Inst ( Inst, LIE(..), plusLIE )
21 import TcBinds ( tcBindsAndThen )
22 import TcExpr ( tcExpr )
23 import TcType ( TcType(..) )
24 import Unify ( unifyTauTy )
26 import TysWiredIn ( boolTy )
30 tcGRHSs :: [RenamedGRHS] -> TcM s ([TcGRHS s], LIE s, TcType s)
33 = tcGRHS grhs `thenTc` \ (grhs', lie, ty) ->
34 returnTc ([grhs'], lie, ty)
37 = tcGRHS grhs `thenTc` \ (grhs', lie1, ty1) ->
38 tcGRHSs grhss `thenTc` \ (grhss', lie2, ty2) ->
39 unifyTauTy ty1 ty2 `thenTc_`
40 returnTc (grhs' : grhss', lie1 `plusLIE` lie2, ty1)
43 tcGRHS (OtherwiseGRHS expr locn)
45 tcExpr expr `thenTc` \ (expr, lie, ty) ->
46 returnTc (OtherwiseGRHS expr locn, lie, ty)
48 tcGRHS (GRHS guard expr locn)
50 tcExpr guard `thenTc` \ (guard2, guard_lie, guard_ty) ->
51 unifyTauTy boolTy guard_ty `thenTc_`
52 tcExpr expr `thenTc` \ (expr2, expr_lie, expr_ty) ->
53 returnTc (GRHS guard2 expr2 locn, plusLIE guard_lie expr_lie, expr_ty)
57 @tcGRHSsAndBinds@ typechecks (grhss where binds), returning suitable
61 tcGRHSsAndBinds :: RenamedGRHSsAndBinds
62 -> TcM s (TcGRHSsAndBinds s, LIE s, TcType s)
64 tcGRHSsAndBinds (GRHSsAndBindsIn grhss binds)
67 (tcGRHSs grhss `thenTc` \ (grhss', lie, ty) ->
68 returnTc (GRHSsAndBindsOut grhss' EmptyBinds ty, lie, ty)
71 combiner binds1 (GRHSsAndBindsOut grhss binds2 ty)
72 = GRHSsAndBindsOut grhss (binds1 `ThenBinds` binds2) ty