Hello Racketeers,
working on gradually typing some of my modules I encountered an
interesting problem:
(define-type Color Fixnum)
(: argb-average (-> Color * Color))
(define (argb-average . argbs)
(let loop ((as : Fixnum 0)
(rs : Fixnum 0)
(gs : Fixnum 0)
(bs : Fixnum 0)
(n : Fixnum 0)
(argbs : (Listof Color) argbs))
(if (null? argbs)
(make-argb (fxquotient as n)
(fxquotient rs n)
(fxquotient gs n)
(fxquotient bs n))
(let-values (((a r g b) (argb-split (car argbs))))
(loop (fx+ as a)
(fx+ rs r)
(fx+ gs g)
(fx+ bs b)
(fx+ n 1)
(cdr argbs))))))
Type Checker: type mismatch
expected: Byte
given: Fixnum
in: (fxquotient bs n)
The only way of fixing this issue was using unsafe-fxquotient which is
unsafe-require/typed accordingly:
(unsafe-require/typed
racket/unsafe/ops
(unsafe-fxquotient (-> Fixnum Fixnum Byte)))
Is there a better way?
The relation between Byte and (Nonnegative-)Fixnum is mathematically
sound here, but making TR understand it is apparently pretty hard...
Cheers,
Dominik
--
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].
To view this discussion on the web visit
https://groups.google.com/d/msgid/racket-users/608fdb93-b2ce-37e0-750c-037b47fed102%40trustica.cz.