Also opaque types might help you:
http://docs.racket-lang.org/ts-reference/special-forms.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._require%2Ftyped%29%29
http://docs.racket-lang.org/ts-reference/type-ref.html#%28form._%28%28lib._typed-racket%2Fbase-env%2Fbase-types-extra..rkt%29._.Opaque%29%29
If you wanted sub-typing too, then refinement types would help, except I don’t
think they work yet.
An example of using them for radians and degrees:
untyped-radians-degrees.rkt:
#lang racket/base
(provide radians? real->radians radians->real
degrees? real->degrees degrees->real
radians->degrees degrees->radians)
(require racket/math)
(define (radians? v) (real? v))
(define (real->radians x) x)
(define (radians->real x) x)
(define (degrees? v) (real? v))
(define (real->degrees x) x)
(define (degrees->real x) x)
typed-radians-degrees.rkt:
#lang typed/racket/base
(require/typed/provide "untyped-radians.rkt"
[#:opaque Radians radians?]
[real->radians [Real -> Radians]]
[radians->real [Radians -> Real]]
[#:opaque Degrees degrees?]
[real->degrees [Real -> Degrees]]
[degrees->real [Degrees -> Real]]
[radians->degrees [Radians -> Degrees]]
[degrees->radians [Degrees -> Radians]])
try-radians-degrees.rkt:
#lang typed/racket/base
(require "typed-radians-degrees.rkt")
(: d-90 : Degrees)
(define d-90 (real->degrees 90.0))
; type mismatch!
(: r-PI : Radians)
(define r-PI (real->degrees 180.0))
On May 23, 2015, at 11:34 PM, Stuart Hungerford <[email protected]>
wrote:
> On Sunday, 24 May 2015 12:50:48 UTC+10, Matthias Felleisen wrote:
>
>> Stuart, would a predicated refinement type work for you:
>>
>> --
>> http://docs.racket-lang.org/ts-reference/special-forms.html?q=define-predicate#%28form._%28%28lib._typed-racket%2Fbase-env%2Fprims..rkt%29._make-predicate%29%29
>
> Looking into that now--many thanks.
>
> Stu
>
>
>
--
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.