@@ -622,32 +622,34 @@ detectDuplicates tag names =
622622
623623checkTypeVarsInUnion :: A.Commented (D.Union Type.Raw) -> Result wrn ()
624624checkTypeVarsInUnion (A.A (region,_) (D.Type name boundVars ctors)) =
625− case diff boundVars (concatMap freeVars (concatMap snd ctors)) of
626− (_, []) ->
627− return ()
625+ do allFreeVars <- concat <$> traverse freeVars (concatMap snd ctors)
626+ case diff boundVars allFreeVars of
627+ (_, []) ->
628+ return ()
628629
629− (_, unbound) ->
630− Result.throw region
631− (Error.UnboundTypeVarsInUnion name boundVars unbound)
630+ (_, unbound) ->
631+ Result.throw region
632+ (Error.UnboundTypeVarsInUnion name boundVars unbound)
632633
633634
634635checkTypeVarsInAlias :: A.Commented (D.Alias Type.Raw) -> Result wrn ()
635636checkTypeVarsInAlias (A.A (region,_) (D.Type name boundVars tipe)) =
636− case diff boundVars (freeVars tipe) of
637− ([], []) ->
638− return ()
637+ do allFreeVars <- freeVars tipe
638+ case diff boundVars allFreeVars of
639+ ([], []) ->
640+ return ()
639641
640− ([], unbound) ->
641− Result.throw region
642− (Error.UnboundTypeVarsInAlias name boundVars unbound)
642+ ([], unbound) ->
643+ Result.throw region
644+ (Error.UnboundTypeVarsInAlias name boundVars unbound)
643645
644− (unused, []) ->
645− Result.throw region
646− (Error.UnusedTypeVarsInAlias name boundVars unused)
646+ (unused, []) ->
647+ Result.throw region
648+ (Error.UnusedTypeVarsInAlias name boundVars unused)
647649
648− (unused, unbound) ->
649− Result.throw region
650− (Error.MessyTypeVarsInAlias name boundVars unused unbound)
650+ (unused, unbound) ->
651+ Result.throw region
652+ (Error.MessyTypeVarsInAlias name boundVars unused unbound)
651653
652654
653655diff :: [String] -> [A.Located String] -> ([String], [String])
@@ -664,21 +666,22 @@ diff left right =
664666 )
665667
666668
667−freeVars :: Type.Raw -> [A.Located String]
669+freeVars :: Type.Raw -> Result wrn [A.Located String]
668670freeVars (A.A region tipe) =
669671 case tipe of
670672 Type.RLambda t1 t2 ->
671− freeVars t1 ++ freeVars t2
673+ (++) <$> freeVars t1 <*> freeVars t2
672674
673675 Type.RVar x ->
674− [A.A region x]
676+ Result.ok [A.A region x]
675677
676678 Type.RType _ ->
677− []
679+ Result.ok []
678680
679681 Type.RApp t ts ->
680− concatMap freeVars (t:ts)
682+ concat <$> traverse freeVars (t:ts)
681683
682684 Type.RRecord fields ext ->
683− maybe [] freeVars ext
684− ++ concatMap (freeVars . snd) fields
685+ do checkDuplicateFields region fields
686+ let types = Maybe.maybeToList ext ++ map snd fields
687+ concat <$> traverse freeVars types