If you really want the type to be precise, then one thing you might be able to do to reduce the size of your union type is this: If your union type is, say the range from 0 to 260, you could use (define-type My-Type (U Byte 256 257 258 259 260)) Or if your range is the same range as an Index plus a few more, or a Fixnum plus a few more, you could use a similar strategy.
But that will still probably be too large, depending on what your range actually is. On Apr 21, 2015, at 12:12 PM, Leif Andersen <[email protected]> wrote: > > You could use a union type, but I’m not sure if a large union type would > > work well in terms of performance? > > I don't think this will work. > > This takes a long time to run (although I'm not sure how much of this is the > macro expansion). > > Anyway, if it takes this long on a union type with 10000 things in it, I > highly doubt it can support a union type with over a million. > > #lang typed/racket > > (require (for-syntax syntax/parse > racket/list)) > > (define-syntax (define-range stx) > (syntax-parse stx > [(_ name range-low range-hi) > #`(define-type name (U #,@(range (syntax-e #'range-low) > (syntax-e #'range-hi))))])) > > (define-range hello 0 10000) > > > ~Leif Andersen > > On Tue, Apr 21, 2015 at 10:41 AM, Matthias Felleisen <[email protected]> > wrote: > #lang typed/racket > > (define-type NDigit (U 0 1 2 3 4 5 6 7 8 9)) > > (define-type SDigit (U 'zero 'one 'two 'three 'four 'five 'six 'seven 'eight > 'nine)) > > (: to-string (-> NDigit SDigit)) > (define (to-string i) > (case i > [(0) (displayln i) 'zero] > [(1) (displayln i) 'zero] > [(2) (displayln i) 'zero] > [(3) (displayln i) 'zero] > [(4) (displayln i) 'zero] > [(5) (displayln i) 'zero] > [(6) (displayln i) 'zero] > [(7) (displayln i) 'zero] > [(8) (displayln i) 'zero] > [(9) (displayln i) 'zero] > ;; can't get here > [else (displayln (+ i i)) 'one])) > > > I wish mousing over i would give me more precise types here. Occurrence > typing subtracts 2 ... from i's type but somehow it doesn't work thru case. > > > On Apr 20, 2015, at 9:09 PM, Benjamin Greenman wrote: > >> The contract integer-in lets me guarantee an integer is within a certain >> range. >> >> (define/contract (mod3 n) >> (-> integer? (integer-in 0 2)) >> (modulo n 3)) >> >> Is there a similar way to specify a type for an integer range? Or do I need >> to use a union type? (I'd really like to specify a range containing over a >> million integers.) >> >> >> -- >> 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. > > > -- > 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. > > > -- > 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. -- 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.

