- returnTc (RecordUpdOut record_expr' record_ty result_record_ty (map instToId dicts) rbinds',
- mkLIE dicts `plusLIE` record_lie `plusLIE` rbinds_lie)
-
-tcMonoExpr (ArithSeqIn seq@(From expr)) res_ty
- = unifyListTy res_ty `thenTc` \ elt_ty ->
- tcMonoExpr expr elt_ty `thenTc` \ (expr', lie1) ->
-
- tcLookupGlobalId enumFromName `thenNF_Tc` \ sel_id ->
- newMethod (ArithSeqOrigin seq)
- sel_id [elt_ty] `thenNF_Tc` \ enum_from ->
-
- returnTc (ArithSeqOut (HsVar (instToId enum_from)) (From expr'),
- lie1 `plusLIE` unitLIE enum_from)
-
-tcMonoExpr in_expr@(ArithSeqIn seq@(FromThen expr1 expr2)) res_ty
- = tcAddErrCtxt (arithSeqCtxt in_expr) $
- unifyListTy res_ty `thenTc` \ elt_ty ->
- tcMonoExpr expr1 elt_ty `thenTc` \ (expr1',lie1) ->
- tcMonoExpr expr2 elt_ty `thenTc` \ (expr2',lie2) ->
- tcLookupGlobalId enumFromThenName `thenNF_Tc` \ sel_id ->
- newMethod (ArithSeqOrigin seq) sel_id [elt_ty] `thenNF_Tc` \ enum_from_then ->
-
- returnTc (ArithSeqOut (HsVar (instToId enum_from_then))
- (FromThen expr1' expr2'),
- lie1 `plusLIE` lie2 `plusLIE` unitLIE enum_from_then)
-
-tcMonoExpr in_expr@(ArithSeqIn seq@(FromTo expr1 expr2)) res_ty
- = tcAddErrCtxt (arithSeqCtxt in_expr) $
- unifyListTy res_ty `thenTc` \ elt_ty ->
- tcMonoExpr expr1 elt_ty `thenTc` \ (expr1',lie1) ->
- tcMonoExpr expr2 elt_ty `thenTc` \ (expr2',lie2) ->
- tcLookupGlobalId enumFromToName `thenNF_Tc` \ sel_id ->
- newMethod (ArithSeqOrigin seq) sel_id [elt_ty] `thenNF_Tc` \ enum_from_to ->
-
- returnTc (ArithSeqOut (HsVar (instToId enum_from_to))
- (FromTo expr1' expr2'),
- lie1 `plusLIE` lie2 `plusLIE` unitLIE enum_from_to)
-
-tcMonoExpr in_expr@(ArithSeqIn seq@(FromThenTo expr1 expr2 expr3)) res_ty
- = tcAddErrCtxt (arithSeqCtxt in_expr) $
- unifyListTy res_ty `thenTc` \ elt_ty ->
- tcMonoExpr expr1 elt_ty `thenTc` \ (expr1',lie1) ->
- tcMonoExpr expr2 elt_ty `thenTc` \ (expr2',lie2) ->
- tcMonoExpr expr3 elt_ty `thenTc` \ (expr3',lie3) ->
- tcLookupGlobalId enumFromThenToName `thenNF_Tc` \ sel_id ->
- newMethod (ArithSeqOrigin seq) sel_id [elt_ty] `thenNF_Tc` \ eft ->
-
- returnTc (ArithSeqOut (HsVar (instToId eft))
- (FromThenTo expr1' expr2' expr3'),
- lie1 `plusLIE` lie2 `plusLIE` lie3 `plusLIE` unitLIE eft)
-
-tcMonoExpr in_expr@(PArrSeqIn seq@(FromTo expr1 expr2)) res_ty
- = tcAddErrCtxt (parrSeqCtxt in_expr) $
- unifyPArrTy res_ty `thenTc` \ elt_ty ->
- tcMonoExpr expr1 elt_ty `thenTc` \ (expr1',lie1) ->
- tcMonoExpr expr2 elt_ty `thenTc` \ (expr2',lie2) ->
- tcLookupGlobalId enumFromToPName `thenNF_Tc` \ sel_id ->
- newMethod (PArrSeqOrigin seq) sel_id [elt_ty] `thenNF_Tc` \ enum_from_to ->
-
- returnTc (PArrSeqOut (HsVar (instToId enum_from_to))
- (FromTo expr1' expr2'),
- lie1 `plusLIE` lie2 `plusLIE` unitLIE enum_from_to)
-
-tcMonoExpr in_expr@(PArrSeqIn seq@(FromThenTo expr1 expr2 expr3)) res_ty
- = tcAddErrCtxt (parrSeqCtxt in_expr) $
- unifyPArrTy res_ty `thenTc` \ elt_ty ->
- tcMonoExpr expr1 elt_ty `thenTc` \ (expr1',lie1) ->
- tcMonoExpr expr2 elt_ty `thenTc` \ (expr2',lie2) ->
- tcMonoExpr expr3 elt_ty `thenTc` \ (expr3',lie3) ->
- tcLookupGlobalId enumFromThenToPName `thenNF_Tc` \ sel_id ->
- newMethod (PArrSeqOrigin seq) sel_id [elt_ty] `thenNF_Tc` \ eft ->
-
- returnTc (PArrSeqOut (HsVar (instToId eft))
- (FromThenTo expr1' expr2' expr3'),
- lie1 `plusLIE` lie2 `plusLIE` lie3 `plusLIE` unitLIE eft)
-
-tcMonoExpr (PArrSeqIn _) _
+ returnM (RecordUpdOut record_expr' record_ty result_record_ty rbinds')
+\end{code}
+
+
+%************************************************************************
+%* *
+ Arithmetic sequences e.g. [a,b..]
+ and their parallel-array counterparts e.g. [: a,b.. :]
+
+%* *
+%************************************************************************
+
+\begin{code}
+tc_expr (ArithSeqIn seq@(From expr)) res_ty
+ = zapToListTy res_ty `thenM` \ elt_ty ->
+ tcCheckRho expr elt_ty `thenM` \ expr' ->
+
+ newMethodFromName (ArithSeqOrigin seq)
+ elt_ty enumFromName `thenM` \ enum_from ->
+
+ returnM (ArithSeqOut (nlHsVar enum_from) (From expr'))
+
+tc_expr in_expr@(ArithSeqIn seq@(FromThen expr1 expr2)) res_ty
+ = addErrCtxt (arithSeqCtxt in_expr) $
+ zapToListTy res_ty `thenM` \ elt_ty ->
+ tcCheckRho expr1 elt_ty `thenM` \ expr1' ->
+ tcCheckRho expr2 elt_ty `thenM` \ expr2' ->
+ newMethodFromName (ArithSeqOrigin seq)
+ elt_ty enumFromThenName `thenM` \ enum_from_then ->
+
+ returnM (ArithSeqOut (nlHsVar enum_from_then) (FromThen expr1' expr2'))
+
+
+tc_expr in_expr@(ArithSeqIn seq@(FromTo expr1 expr2)) res_ty
+ = addErrCtxt (arithSeqCtxt in_expr) $
+ zapToListTy res_ty `thenM` \ elt_ty ->
+ tcCheckRho expr1 elt_ty `thenM` \ expr1' ->
+ tcCheckRho expr2 elt_ty `thenM` \ expr2' ->
+ newMethodFromName (ArithSeqOrigin seq)
+ elt_ty enumFromToName `thenM` \ enum_from_to ->
+
+ returnM (ArithSeqOut (nlHsVar enum_from_to) (FromTo expr1' expr2'))
+
+tc_expr in_expr@(ArithSeqIn seq@(FromThenTo expr1 expr2 expr3)) res_ty
+ = addErrCtxt (arithSeqCtxt in_expr) $
+ zapToListTy res_ty `thenM` \ elt_ty ->
+ tcCheckRho expr1 elt_ty `thenM` \ expr1' ->
+ tcCheckRho expr2 elt_ty `thenM` \ expr2' ->
+ tcCheckRho expr3 elt_ty `thenM` \ expr3' ->
+ newMethodFromName (ArithSeqOrigin seq)
+ elt_ty enumFromThenToName `thenM` \ eft ->
+
+ returnM (ArithSeqOut (nlHsVar eft) (FromThenTo expr1' expr2' expr3'))
+
+tc_expr in_expr@(PArrSeqIn seq@(FromTo expr1 expr2)) res_ty
+ = addErrCtxt (parrSeqCtxt in_expr) $
+ zapToPArrTy res_ty `thenM` \ elt_ty ->
+ tcCheckRho expr1 elt_ty `thenM` \ expr1' ->
+ tcCheckRho expr2 elt_ty `thenM` \ expr2' ->
+ newMethodFromName (PArrSeqOrigin seq)
+ elt_ty enumFromToPName `thenM` \ enum_from_to ->
+
+ returnM (PArrSeqOut (nlHsVar enum_from_to) (FromTo expr1' expr2'))
+
+tc_expr in_expr@(PArrSeqIn seq@(FromThenTo expr1 expr2 expr3)) res_ty
+ = addErrCtxt (parrSeqCtxt in_expr) $
+ zapToPArrTy res_ty `thenM` \ elt_ty ->
+ tcCheckRho expr1 elt_ty `thenM` \ expr1' ->
+ tcCheckRho expr2 elt_ty `thenM` \ expr2' ->
+ tcCheckRho expr3 elt_ty `thenM` \ expr3' ->
+ newMethodFromName (PArrSeqOrigin seq)
+ elt_ty enumFromThenToPName `thenM` \ eft ->
+
+ returnM (PArrSeqOut (nlHsVar eft) (FromThenTo expr1' expr2' expr3'))
+
+tc_expr (PArrSeqIn _) _