[racket] [Typed Racket] define-predicate for union with functions
You can sort of fake it if you wrap your function in a structure type. In
lieu of
(define-type T1 (Symbol -> String))
Instead use a struct:.
(struct: T1 ([f : (Symbol -> String)]))
;; predicate is T1? for a wrapped Symbol->String function
(define-type T2 (U Symbol Number T1)) ;; T1 is a boxed function of
Symbol->String
(: yup (T2 -> String))
(define (yup t2)
(cond
((symbol? t2) (symbol->string t2))
((number? t2) (number->string t2))
(else (match t2
((T1 f) (f 'goodbye))))))
(yup 'hello)
(yup 123)
(yup (T1 symbol->string))
And I don't know but maybe it would be possible for a sufficiently smart
compiler to elide the T1 boxing and unboxing of the wrapped function.
Well for that matter eliding any single wrapped value type.
On Tue, May 21, 2013 at 9:54 AM, Matthias Felleisen <matthias at ccs.neu.edu>wrote:
>
> (And this is not a limitation of Typed Racket but a fundamental problem of
> CS.)
>
>
> On May 20, 2013, at 11:07 AM, Eric Dobson <eric.n.dobson at gmail.com> wrote:
>
> > No, you cannot define predicates for function types. If you explain
> > the problem you have, we might be able to explain another solution
> > that will work.
> >
> > On Mon, May 20, 2013 at 1:32 AM, Paul Leger <pleger at gmail.com> wrote:
> >> Hi all,
> >> Maybe, this question is very easy. In the following code, I try
> >> defining a predicate for T2, but I cannot because T1 it is a function.
> >>
> >> (define-type T1 (Symbol -> Any) )
> >> (define-type T2 (U Symbol Number T1))
> >>
> >> ;(define-predicate T1? Procedure) ;this line is useless
> >>
> >> (define-predicate T2? T2)
> >>
> >>> Type Checker: Type T2 could not be converted to a contract. in: T2
> >>
> >> My unsuccessful answer is:
> >> (define-type T2 (U Symbol Number Procedure))
> >>
> >> I do not like it because I lose the relationship between T1 and T2. Are
> >> there some possibility
> >>
> >> Thank in advance,
> >> Paul
> >>
> >> ____________________
> >> Racket Users list:
> >> http://lists.racket-lang.org/users
> >>
> > ____________________
> > Racket Users list:
> > http://lists.racket-lang.org/users
>
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20130521/84986a6b/attachment.html>