[racket] Typed Racket: verbose error message?
I was working on the following snippet of code in Typed Racket:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-type InstructionSequence (U Symbol instruction-sequence))
(define-struct: instruction-sequence ([needs : (Listof Symbol)]
[modifies : (Listof Symbol)]
[statements : (Listof Any)])
#:transparent)
(: registers-modified (InstructionSequence -> (Listof Symbol)))
(define (registers-modified s)
(if (symbol? s) '() (instruction-sequence-modifies s)))
(: modifies-register? (InstructionSequence Symbol -> Boolean))
(define (modifies-register? seq reg)
(memq reg (registers-modified seq)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Typed Racket responded with a message that said:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
. Type Checker: Polymorphic function memq could not be applied to arguments:
Argument 1:
Expected: a
Given: Symbol
Argument 2:
Expected: (Listof a)
Given: (Listof Symbol)
Result type: (U (Listof a) False)
Expected result: Boolean
in: (memq reg (registers-modified seq))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
It took me a long time to finally figure out that the error was trying
to tell me that the result type was wrong, because the parts of the
error message that was talking about Argument 1 and Argument 2
distracted me from looking at the rest of the error message. Can this
be improved?
(The fix to my code is to make sure the result is boolean by doing
(and (memq ...) #t).