Fix expected type when typechecking map
(cherry picked from commit 863ac05332
)
This commit is contained in:
parent
5345c1f7d3
commit
d426867956
|
@ -1626,6 +1626,10 @@
|
||||||
(Listof Symbol))]
|
(Listof Symbol))]
|
||||||
[tc-e (filter values empty)
|
[tc-e (filter values empty)
|
||||||
(-lst -Bottom)]
|
(-lst -Bottom)]
|
||||||
|
[tc-e (lambda lst (map (plambda: (b) ([x : b]) x) lst))
|
||||||
|
(-polydots (a) (->... (list) (a a) (make-ListDots a 'a)))
|
||||||
|
#:expected (ret (-polydots (a) (->... (list) (a a) (make-ListDots a 'a))))]
|
||||||
|
|
||||||
|
|
||||||
[tc-e
|
[tc-e
|
||||||
((inst filter Any Symbol) symbol? null)
|
((inst filter Any Symbol) symbol? null)
|
||||||
|
|
|
@ -42,12 +42,19 @@
|
||||||
...))
|
...))
|
||||||
(=> fail)
|
(=> fail)
|
||||||
(unless (for/and ([b bound]) (or (not b) (eq? bound0 b))) (fail))
|
(unless (for/and ([b bound]) (or (not b) (eq? bound0 b))) (fail))
|
||||||
|
(define expected-elem-type
|
||||||
|
(match expected
|
||||||
|
[(or #f (tc-any-results:)) #f]
|
||||||
|
[(tc-result1: (ListDots: elem-type (== bound0))) (ret elem-type)]
|
||||||
|
[(tc-result1: (Listof: elem-type)) (ret elem-type)]
|
||||||
|
[else (fail)]))
|
||||||
;; Do not check this in an environment where bound0 is a type variable.
|
;; Do not check this in an environment where bound0 is a type variable.
|
||||||
(define f-type (tc-expr #'f))
|
(define f-type (tc-expr #'f))
|
||||||
;; Check that the function applies successfully to the element type
|
;; Check that the function applies successfully to the element type
|
||||||
;; We need the bound to be considered a type var here so that inference works
|
;; We need the bound to be considered a type var here so that inference works
|
||||||
(match (extend-tvars (list bound0)
|
(match (extend-tvars (list bound0)
|
||||||
(tc/funapp #'f #'(arg0 arg ...) f-type (cons (ret t0) (map ret t)) expected))
|
(tc/funapp #'f #'(arg0 arg ...) f-type (cons (ret t0) (map ret t))
|
||||||
|
expected-elem-type))
|
||||||
[(tc-result1: t) (ret (make-ListDots t bound0))]
|
[(tc-result1: t) (ret (make-ListDots t bound0))]
|
||||||
[(tc-results: ts)
|
[(tc-results: ts)
|
||||||
(tc-error/expr #:return (ret (Un))
|
(tc-error/expr #:return (ret (Un))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user