on master help sign in
Provide hint for "not enough args"
commit22bbeaefc56567ca6a66cb7dc03e4f25eacc2151 authorEvan Czaplicki <evancz@users.noreply.github.com> dateMon 8 Aug 2016, 14:21 (10 years ago) parentd00bed9
2 files changed+32−1
src/Reporting/Error/Type.hs+9 src/Type/Unify.hs+23−1
src/Reporting/Error/Type.hs+9
@@ -39,6 +39,7 @@ data Reason
3939 = MessyFields [String] [String]
4040 | IntFloat
4141 | TooLongComparableTuple Int
42+ | MissingArgs Int
4243 | BadVar (Maybe VarType) (Maybe VarType)
4344
4445
@@ -591,6 +592,9 @@ flipReason reason =
591592 TooLongComparableTuple len ->
592593 TooLongComparableTuple len
593594
595+ MissingArgs num ->
596+ MissingArgs num
597+
594598 BadVar left right ->
595599 BadVar right left
596600
@@ -618,6 +622,11 @@ reasonToString reason =
618622 "Although tuples are comparable, this is currently only supported\
619623 \ for tuples with 6 or fewer entries, not " ++ show len ++ "."
620624
625+ MissingArgs num ->
626+ go $
627+ "It looks like a function needs " ++ show num ++ " more "
628+ ++ (if num == 1 then "argument" else "arguments") ++ "."
629+
621630 BadVar (Just Comparable) _ ->
622631 go "Only ints, floats, chars, strings, lists, and tuples are comparable."
623632
src/Type/Unify.hs+23−1
@@ -76,7 +76,18 @@ newtype Mismatch =
7676
7777
7878mismatch :: Context -> Maybe Error.Reason -> Unify a
79−mismatch (Context orientation _ _ _ _) maybeReason =
79+mismatch (Context orientation var1 _ var2 _) maybeReason =
80+ do numArgs1 <- liftIO $ countArgs var1
81+ numArgs2 <- liftIO $ countArgs var2
82+ mismatchHelp orientation $
83+ if numArgs1 == numArgs2 then
84+ maybeReason
85+ else
86+ Just (Error.MissingArgs (abs (numArgs2 - numArgs1)))
87+
88+
89+mismatchHelp :: Orientation -> Maybe Error.Reason -> Unify a
90+mismatchHelp orientation maybeReason =
8091 throwError $ Mismatch $
8192 case orientation of
8293 ExpectedActual ->
@@ -443,6 +454,17 @@ collectAppsHelp args content =
443454 return Other
444455
445456
457+countArgs :: Variable -> IO Int
458+countArgs variable =
459+ do content <- getContent variable
460+ case content of
461+ Structure (Fun1 _ returnType) ->
462+ (+1) <$> countArgs returnType
463+
464+ _ ->
465+ return 0
466+
467+
446468getContent :: Variable -> IO Content
447469getContent variable =
448470 _content <$> UF.descriptor variable