on master help sign in
Fix unification of String/appendable and Char/comparable
commit097ac1e32c7d221bfa14acc27561da005d54d076 authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 21 Feb 2018, 11:03 (9 years ago) parentf5f9ed0
3 files changed+62−25
src/Reporting/Error/Type.hs+43−15 src/Type/Error.hs+6 src/Type/Unify.hs+13−10
src/Reporting/Error/Type.hs+43−15
@@ -471,18 +471,18 @@ problemToHint problem =
471471
472472 T.BadFlexSuper super _ tipe ->
473473 case tipe of
474− T.Lambda _ _ _ -> badFlexSuper super
474+ T.Lambda _ _ _ -> badFlexSuper super tipe
475475 T.Infinite -> []
476476 T.Error -> []
477477 T.FlexVar _ -> []
478478 T.FlexSuper s _ -> badFlexFlexSuper super s
479479 T.RigidVar y -> badRigidVar y (toASuperThing super)
480480 T.RigidSuper s _ -> badRigidSuper s (toASuperThing super)
481− T.Type _ _ _ -> badFlexSuper super
482− T.Record _ _ -> badFlexSuper super
483− T.Unit -> badFlexSuper super
484− T.Tuple _ _ _ -> badFlexSuper super
485− T.Alias _ _ _ _ -> badFlexSuper super
481+ T.Type h n _ -> badFlexSuper super tipe
482+ T.Record _ _ -> badFlexSuper super tipe
483+ T.Unit -> badFlexSuper super tipe
484+ T.Tuple _ _ _ -> badFlexSuper super tipe
485+ T.Alias _ _ _ _ -> badFlexSuper super tipe
486486
487487 T.BadRigidVar x tipe ->
488488 case tipe of
@@ -554,16 +554,45 @@ toASuperThing super =
554554-- BAD SUPER HINTS
555555
556556
557−badFlexSuper :: T.Super -> [H.Doc]
558−badFlexSuper super =
557+badFlexSuper :: T.Super -> T.Type -> [H.Doc]
558+badFlexSuper super tipe =
559559 case super of
560− T.Comparable -> [ H.toSimpleHint "Only ints, floats, chars, strings, lists, and tuples are comparable." ]
561− T.Appendable -> [ H.toSimpleHint "Only strings and lists are appendable." ]
562− T.CompAppend -> [ H.toSimpleHint "Only strings and lists are both comparable and appendable." ]
563− T.Number ->
564− [ H.toFancyHint ["Only",H.green "Int","and",H.green "Float","values","work","as","numbers."]
560+ T.Comparable ->
561+ [ H.toSimpleHint "Only ints, floats, chars, strings, lists, and tuples are comparable."
562+ ]
563+
564+ T.Appendable ->
565+ case tipe of
566+ T.Type home name _ | T.isInt home name ->
567+ [ H.toFancyHint ["Try","using",H.green"String.fromInt","to","convert","it","to","a","string?"]
568+ ]
569+
570+ T.Type home name _ | T.isFloat home name ->
571+ [ H.toFancyHint ["Try","using",H.green"String.fromFloat","to","convert","it","to","a","string?"]
572+ ]
573+
574+ T.FlexSuper T.Number _ ->
575+ [ H.toFancyHint ["Try","using",H.green"String.fromInt","to","convert","it","to","a","string?"]
576+ ]
577+
578+ _ ->
579+ [ H.toFancyHint ["Only","strings","and","lists","are","appendable.","Put","it","in",H.green "[]","to","make","it","a","list?"]
580+ ]
581+
582+ T.CompAppend ->
583+ [ H.toSimpleHint "Only strings and lists are both comparable and appendable."
565584 ]
566585
586+ T.Number ->
587+ case tipe of
588+ T.Type home name _ | T.isString home name ->
589+ [ H.toFancyHint ["Try","using",H.green"String.toInt","to","convert","it","to","a","number?"]
590+ ]
591+
592+ _ ->
593+ [ H.toFancyHint ["Only",H.green "Int","and",H.green "Float","values","work","as","numbers."]
594+ ]
595+
567596
568597badRigidSuper :: T.Super -> String -> [H.Doc]
569598badRigidSuper super aThing =
@@ -1282,8 +1311,7 @@ badAppendLeft localizer category tipe expected =
12821311 ANumber thing stringFromThing ->
12831312 (
12841313 H.fillSep
1285− ["The","(++)","operator","can","append"
1286− ,H.dullyellow "List","and",H.dullyellow "String"
1314+ ["The","(++)","operator","can","append","List","and","String"
12871315 ,"values,","but","not",H.dullyellow thing,"values","like","this:"
12881316 ]
12891317 ,
src/Type/Error.hs+6
@@ -12,6 +12,7 @@ module Type.Error
1212 , isInt
1313 , isFloat
1414 , isString
15+ , isChar
1516 , isList
1617 )
1718 where
@@ -313,6 +314,11 @@ isString home name =
313314 home == ModuleName.string && name == N.string
314315
315316
317+isChar :: ModuleName.Canonical -> N.Name -> Bool
318+isChar home name =
319+ home == ModuleName.char && name == N.char
320+
321+
316322isMaybe :: ModuleName.Canonical -> N.Name -> Bool
317323isMaybe home name =
318324 home == ModuleName.maybe && name == N.maybe
src/Type/Unify.hs+13−10
@@ -360,24 +360,27 @@ combineRigidSupers rigid flex =
360360
361361atomMatchesSuper :: SuperType -> ModuleName.Canonical -> N.Name -> Bool
362362atomMatchesSuper super home name =
363− home == ModuleName.basics
364− &&
365363 case super of
366364 Number ->
367− name == N.int
368− || name == N.float
365+ isNumber home name
369366
370367 Comparable ->
371− name == N.int
372− || name == N.float
373− || name == N.string
374− || name == N.char
368+ isNumber home name
369+ || Error.isString home name
370+ || Error.isChar home name
375371
376372 Appendable ->
377− name == N.string
373+ Error.isString home name
378374
379375 CompAppend ->
380− name == N.string
376+ Error.isString home name
377+
378+
379+isNumber :: ModuleName.Canonical -> N.Name -> Bool
380+isNumber home name =
381+ home == ModuleName.basics
382+ &&
383+ (name == N.int || name == N.float)
381384
382385
383386unifyFlexSuperStructure :: Context -> SuperType -> FlatType -> Unify ()