Hi everyone, I have a strange example for you. The following code throws an error in typed/racket 6.7:
> (define (list1) : (Listof (Setof Positive-Byte))
(list (set 2) (set 3 2)))
(apply set-union (list1))
Type Checker: Bad arguments to function in `apply':
Domain: (Setof e) (Setof e) *
Arguments: (Listof (Setof Positive-Byte)) *
in: (apply set-union (list1))
At first I thought "doh! There's a note in the docs about polymorphic
function, just use inst". But on the other hand,
> (define list0
(list (set 2) (set 3 2)))
(apply set-union list0)
Happily compiles and evaluates to the expected result. For the record,
(inst set-union Positive-Byte) does not help.
What is weirder is that if I open a fresh repl and try:
> (define list0 : (Listof (Setof Positive-Byte))
(list (set 2) (set 3 2)))
(apply set-union list0)
It then throws the same error.
I wasn't able to get the same error with other polymorphic functions as
much as I tried. It turns out this is limited to set-union and
set-subtract. the type signatures of this functions are:
(-> (Setof e) (Setof e) * (Setof e))
Therein lies our problem. we need to curry set-union, et al, to get rid
of that leading argument! But to curry we run into polymorphic type
problems. so we do:
> (apply (curry (inst set-union Positive-Byte) (ann (set) (Setof
> Positive-Byte))) (list1))
That's a bit of a mouthful, but racket is as happy as a clam. Might I
hope for a cleaner way to write this in a later version?
Somewhat related, I have one parting question: Out of the two:
> (define list0
(list (set 2) (set 3 2)))
(apply set-union list0)
> (define list2 : (Listof (Setof Positive-Byte))
(list (set 2) (set 3 2)))
(apply set-union list2)
Why does the former work and the latter fail ?
Thanks,
Matthew Eric
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
signature.asc
Description: OpenPGP digital signature

