@@ -491,14 +491,12 @@ data Info = Info
491491
492492constrainDef :: Env.Env -> Info -> Canonical.Def -> IO Info
493493constrainDef env info (Canonical.Def _ (A.A patternRegion pattern) expr maybeTipe) =
494− let qs = [] -- should come from the def, but I'm not sure what would live there...
495− in
496494 case (pattern, maybeTipe) of
497495 (P.Var name, Nothing) ->
498− constrainUnannotatedDef env info qs patternRegion name expr
496+ constrainUnannotatedDef env patternRegion name expr info
499497
500− (P.Var name, Just (A.A typeRegion tipe)) ->
501− constrainAnnotatedDef env info qs patternRegion typeRegion name expr tipe
498+ (P.Var name, Just (A.A _ tipe)) ->
499+ constrainAnnotatedDef env patternRegion name expr tipe info
502500
503501 _ ->
504502 error "canonical definitions must not have complex patterns as names in the contstraint generation phase"
@@ -506,66 +504,79 @@ constrainDef env info (Canonical.Def _ (A.A patternRegion pattern) expr maybeTip
506504
507505constrainUnannotatedDef
508506 :: Env.Env
509− -> Info
510− -> [String]
511507 -> R.Region
512508 -> String
513509 -> Canonical.Expr
510+ -> Info
514511 -> IO Info
515−constrainUnannotatedDef env info qs patternRegion name expr =
516− do -- Some mistake may be happening here. Currently, qs is always [].
517− rigidVars <- mapM mkRigid qs
518−
519− v <- mkVar Nothing
520−
512+constrainUnannotatedDef env patternRegion name expr info =
513+ do v <- mkVar Nothing
521514 let tipe = VarN v
522−
523− let env' = Env.addValues env (zip qs rigidVars)
524−
525− con <- constrain env' expr tipe
526−
515+ defCon <- constrain env expr tipe
527516 return $ info
528− { iRigid = rigidVars ++ iRigid info
529− , iFlex = v : iFlex info
517+ { iFlex = v : iFlex info
530518 , iHeaders = Map.insert name (A.A patternRegion tipe) (iHeaders info)
531− , iC2 = con /\ iC2 info
519+ , iC2 = defCon /\ iC2 info
532520 }
533521
534522
535−constrainAnnotatedDef
536− :: Env.Env
537− -> Info
538− -> [String]
539− -> R.Region
540− -> R.Region
541− -> String
542− -> Canonical.Expr
543− -> ST.Canonical
544− -> IO Info
545−constrainAnnotatedDef env info qs patternRegion typeRegion name expr tipe =
546− do -- Some mistake may be happening here. Currently, qs is always [].
547− rigidVars <- mapM mkRigid qs
548−
549− flexiVars <- mapM mkNamedVar qs
550−
551− let env' = Env.addValues env (zip qs flexiVars)
552−
553− (vars, typ) <- Env.instantiateType env tipe Map.empty
523+constrainAnnotatedDef :: Env.Env -> R.Region -> String -> Canonical.Expr -> ST.Canonical -> Info -> IO Info
524+constrainAnnotatedDef env region name expr tipe info =
525+ do (flexType, flexVars) <- Env.instantiateType Flex env tipe
554526
555527 let scheme =
556528 Scheme
557529 { _rigidQuantifiers = []
558− , _flexibleQuantifiers = flexiVars ++ vars
530+ , _flexibleQuantifiers = Map.elems flexVars
559531 , _constraint = CTrue
560− , _header = Map.singleton name (A.A patternRegion typ)
532+ , _header = Map.singleton name (A.A region flexType)
561533 }
562534
563− var <- mkVar Nothing
564− defCon <- constrain env' expr (VarN var)
565− let annCon =
566− CEqual (Error.BadTypeAnnotation name) typeRegion typ (VarN var)
535+ defCon <- constrainAnnDefHelp name expr tipe (ArgInfo env [] [])
567536
568537 return $ info
569538 { iSchemes = scheme : iSchemes info
570− , iC1 = iC1 info /\ ex [var] (defCon /\ fl rigidVars annCon)
539+ , iC1 = iC1 info /\ defCon
571540 }
541+
542+
543+
544+data ArgInfo =
545+ ArgInfo
546+ { _env :: Env.Env
547+ , _args :: [(P.Canonical, Type)]
548+ , _vars :: [Variable]
549+ }
550+
551+
552+constrainAnnDefHelp :: String -> Canonical.Expr -> ST.Canonical -> ArgInfo -> IO TypeConstraint
553+constrainAnnDefHelp name expr tipe (ArgInfo env args vars) =
554+ case (expr, tipe) of
555+ (A.A _ (E.Lambda arg result), ST.Lambda argType resultType) ->
556+ do (rigidArgType, newVars) <- Env.instantiateType Rigid env argType
557+
558+ constrainAnnDefHelp name result resultType $
559+ ArgInfo
560+ { _env = Env.addValues newVars env
561+ , _args = (arg, rigidArgType) : args
562+ , _vars = Map.elems newVars ++ vars
563+ }
564+
565+ (A.A region _, _) ->
566+ do (rigidType, newVars) <- Env.instantiateType Rigid env tipe
567+
568+ let finalEnv = Env.addValues newVars env
569+ let finalArgs = reverse args
570+ let rigidVars = Map.elems newVars ++ vars
571+
572+ (Pattern.Info headers argVars argCons) <-
573+ Pattern.joinInfos <$> mapM (uncurry (Pattern.constrain finalEnv)) finalArgs
574+
575+ resultVar <- mkVar Nothing
576+ let resultType = VarN resultVar
577+ defCon <- constrain finalEnv expr resultType
578+ let resultCon =
579+ CEqual (Error.ReturnType name (length args)) region resultType rigidType
580+
581+ return $ forall rigidVars $ ex (resultVar : argVars) $ CLet [monoscheme headers] $
582+ CAnd [ argCons, defCon, resultCon ]