2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[TcGRHSs]{Typecheck guarded right-hand-sides}
7 module TcGRHSs ( tcGRHSsAndBinds ) where
10 import TcLoop -- for paranoia checking
12 import HsSyn ( GRHSsAndBinds(..), GRHS(..),
13 HsExpr, HsBinds(..), InPat, OutPat, Bind, Sig, Fake )
14 import RnHsSyn ( RenamedGRHSsAndBinds(..), RenamedGRHS(..) )
15 import TcHsSyn ( TcGRHSsAndBinds(..), TcGRHS(..), TcIdOcc(..) )
18 import Inst ( Inst, LIE(..), plusLIE )
19 import TcBinds ( tcBindsAndThen )
20 import TcExpr ( tcExpr )
21 import TcType ( TcType(..) )
22 import Unify ( unifyTauTy )
24 import PrelInfo ( boolTy )
28 tcGRHSs :: [RenamedGRHS] -> TcM s ([TcGRHS s], LIE s, TcType s)
31 = tcGRHS grhs `thenTc` \ (grhs', lie, ty) ->
32 returnTc ([grhs'], lie, ty)
35 = tcGRHS grhs `thenTc` \ (grhs', lie1, ty1) ->
36 tcGRHSs grhss `thenTc` \ (grhss', lie2, ty2) ->
37 unifyTauTy ty1 ty2 `thenTc_`
38 returnTc (grhs' : grhss', lie1 `plusLIE` lie2, ty1)
41 tcGRHS (OtherwiseGRHS expr locn)
43 tcExpr expr `thenTc` \ (expr, lie, ty) ->
44 returnTc (OtherwiseGRHS expr locn, lie, ty)
46 tcGRHS (GRHS guard expr locn)
48 tcExpr guard `thenTc` \ (guard2, guard_lie, guard_ty) ->
49 unifyTauTy boolTy guard_ty `thenTc_`
50 tcExpr expr `thenTc` \ (expr2, expr_lie, expr_ty) ->
51 returnTc (GRHS guard2 expr2 locn, plusLIE guard_lie expr_lie, expr_ty)
55 @tcGRHSsAndBinds@ typechecks (grhss where binds), returning suitable
59 tcGRHSsAndBinds :: RenamedGRHSsAndBinds
60 -> TcM s (TcGRHSsAndBinds s, LIE s, TcType s)
62 tcGRHSsAndBinds (GRHSsAndBindsIn grhss binds)
65 (tcGRHSs grhss `thenTc` \ (grhss', lie, ty) ->
66 returnTc (GRHSsAndBindsOut grhss' EmptyBinds ty, lie, ty)
69 combiner binds1 (GRHSsAndBindsOut grhss binds2 ty)
70 = GRHSsAndBindsOut grhss (binds1 `ThenBinds` binds2) ty