@@ -77,14 +77,19 @@ newtype Mismatch =
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
84− if numArgs1 == numArgs2 then
87+ if numArgs1 == numArgs2
85− maybeReason
89+ mismatchHelp orientation maybeReason
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)
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
458−countArgs :: Variable -> IO Int
463+collectArgs :: Variable -> IO [Variable]
459−countArgs variable =
464+collectArgs variable =
465+ collectArgsHelp [] variable
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
466− return 0
476+ return $ variable : revArgs
469getContent :: Variable -> IO Content
479getContent :: Variable -> IO Content