on master help sign in
Improve missing args type diff
4d800cdEvan Czaplicki
src/Type/Unify.hs+22−12
@@ -77,14 +77,19 @@ newtype Mismatch =
77
77
78
78
79mismatch :: Context -> Maybe Error.Reason -> Unify a
79mismatch :: Context -> Maybe Error.Reason -> Unify a
80−mismatch (Context orientation var1 _ var2 _) maybeReason =
80+mismatch context@(Context orientation var1 _ var2 _) maybeReason =
81− do numArgs1 <- liftIO $ countArgs var1
81+ do args1 <- liftIO $ collectArgs var1
82− numArgs2 <- liftIO $ countArgs var2
82+ args2 <- liftIO $ collectArgs var2
83− mismatchHelp orientation $
83+
84+ let numArgs1 = length args1
85+ let numArgs2 = length args2
86+
84− if numArgs1 == numArgs2 then
87+ if numArgs1 == numArgs2
88+ then
85− maybeReason
89+ mismatchHelp orientation maybeReason
86 else
90 else
91+ do zipWithM_ (\arg1 arg2 -> lift $ runExceptT $ subUnify context arg1 arg2) args1 args2
87− Just (Error.MissingArgs (abs (numArgs2 - numArgs1)))
92+ mismatchHelp orientation $ Just $ Error.MissingArgs $ abs (numArgs2 - numArgs1)
88
93
89
94
90mismatchHelp :: Orientation -> Maybe Error.Reason -> Unify a
95mismatchHelp :: Orientation -> Maybe Error.Reason -> Unify a
@@ -455,15 +460,20 @@ collectAppsHelp args content =
455 return Other
460 return Other
456
461
457
462
458−countArgs :: Variable -> IO Int
463+collectArgs :: Variable -> IO [Variable]
459−countArgs variable =
464+collectArgs variable =
465+ collectArgsHelp [] variable
466+
467+
468+collectArgsHelp :: [Variable] -> Variable -> IO [Variable]
469+collectArgsHelp revArgs variable =
460 do content <- getContent variable
470 do content <- getContent variable
461 case content of
471 case content of
462− Structure (Fun1 _ returnType) ->
472+ Structure (Fun1 arg returnType) ->
463− (+1) <$> countArgs returnType
473+ collectArgsHelp (arg : revArgs) returnType
464
474
465 _ ->
475 _ ->
466− return 0
476+ return $ variable : revArgs
467
477
468
478
469getContent :: Variable -> IO Content
479getContent :: Variable -> IO Content