No, there's no 'and' for types. Adding that would significantly increase the complexity of the type checker, and so it's not on the horizon for Typed Racket. Bounded polymorphism, as I mentioned earlier, is more likely to be added.
Sam On Apr 25, 2014 11:06 PM, "Alexander D. Knauth" <alexan...@knauth.org> wrote: > Then is there something like and/c for types? (like U is like or/c for > types) That could probably solve it. > > It seems like typed racket is already doing this in some cases, for > example: > #lang typed/racket > > (define positive-real? (make-predicate Positive-Real)) > > (define (f x) > (if (positive-real? x) > (if (exact-integer? x) > x > (error "error")) > (error "error"))) > > > f > - : (Any -> Positive-Integer) > #<procedure:f> > In this, typed racket figures out that f produces a Positive-Integer, when > it was only given that it produces something that is both a Positive-Real > and an Integer. > > But I couldn’t find it in the docs. > > On Apr 25, 2014, at 10:48 PM, Sam Tobin-Hochstadt <sa...@cs.indiana.edu> > wrote: > > What you're looking for is called bounded polymorphism. Sadly, Typed > Racket doesn't support this, so I'd try one of the options David suggests. > > Sam > On Apr 25, 2014 10:46 PM, "Alexander D. Knauth" <alexan...@knauth.org> > wrote: > >> That’s what I tried at first, but my actual struct is a lot more >> complicated than posn, and it kept giving be type-check errors, and trying >> to enforce the types of the fields myself just ended up with completely >> unreadable code and even more type errors, so I gave up on making it >> polymorphic, but I still wanted to be able to specify specific cases of it >> as types that would only contain that specific case of it. >> >> On Apr 25, 2014, at 10:25 PM, David Van Horn <dvanh...@cs.umd.edu> wrote: >> >> > On 4/25/14, 9:57 PM, Alexander D. Knauth wrote: >> >> But then the posn constructor doesn’t enforce that it’s arguments have >> to be Reals, and the posn? predicate doesn’t check it, and the accessors >> don’t say that they always produce Reals. >> > >> > Maybe I'm not seeing the big picture, but that's what the Posn type is >> > for. If you apply posn to something other than reals, you won't get a >> > Posn. If you have a Posn and apply posn-x, you get a real. >> > >> > (define: (f [p : Posn]) : Real >> > (+ (posn-x p) (posn-y p))) >> > >> > David >> > >> > >> >> On Apr 25, 2014, at 9:49 PM, David Van Horn <dvanh...@cs.umd.edu> >> wrote: >> >> >> >>> How about this? >> >>> >> >>> (struct: (x y) posn ([x : x] [y : y])) >> >>> (define-type Posn (posn Real Real)) >> >>> (define-type Origin (posn Zero Zero)) >> >>> >> >>> >> > >> >> >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users >> > >
____________________ Racket Users list: http://lists.racket-lang.org/users