racket/typed-racket

Better error message for misuse of row polymorphic types and add documentation for `(All (r #:row) body)`

Aperta

#1146 aperta il 5 ott 2021

 (0 commenti) (0 reazioni) (0 assegnatari)Racket (106 fork)github user discovery
classgood first issue

Metriche repository

Star
 (576 stelle)
Metriche merge PR
 (Merge medio 11g 14h) (1 PR mergiata in 30 g)

Descrizione

What version of Racket are you using?

Racket 8.2.0.8

What program did you run?


(: hi (All (r #:row)
           (-> r r)))
(define (hi a)
  a)

What should have happened?

The type checker should reject the program, because a type variable for a polymorphic row type is in fact only allowed to appear in (Class #:row-var _) in Typed Racket.

If you got an error message, please include it here.

No error message. But the type checker does not produce useful error messages when hi is called, e.g.: (hi 10) ===>

Type Checker: Polymorphic function `hi' could not be applied to arguments:
Argument 1:
  Expected: r
  Given:    Positive-Byte

Result type:     r
Expected result: AnyValues

Calling hi with a class type causes an internal error (with PLT_TR_CONTRACT enabled)

(define cls1
  (class object%
    ; Note the missing `super-new`
    (init-field [x : Real 0] [y : Real 0])
    (super-new)))

(hi cls1)

===>

check-below: contract violation
  expected: (or/c Type? tc-results/c)
  given: (Row (list (list 'x Real #t) (list 'y Real #t)) (list (list 'x Real) (list 'y Real)) '() '() #f)
  in: the t argument of
      (->i
       ((s
         (t)
         (if (Type? t)
           (-or/c full-tc-results/c Type?)
           full-tc-results/c))
        (t (or/c Type? tc-results/c)))
       (_
        (t)
        (if (Type? t) Type? full-tc-results/c)))
  contract from: 
      <pkgs>/typed-racket-lib/typed-racket/typecheck/check-below.rkt
  blaming: <pkgs>/typed-racket-lib/typed-racket/typecheck/tc-app-helper.rkt
   (assuming the contract is correct)
  at: <pkgs>/typed-racket-lib/typed-racket/typecheck/check-below.rkt:20:2

lack of documentation how to define polymorphic row types

It seems the documentation for (All (r #:row) body) is missing

Guida contributor