Types are a purely compile-time construct, so type polymorphism doesn’t make 
any sense in a dynamic context. You can create a predicate that checks if some 
value is any Foo:

(define-predicate foo? (Foo Any))

Or you can even create a predicate that checks if some value is a specific type 
of Foo:

(define-syntax-rule (Foo? A)
    (make-predicate (Foo A))

But in the latter case, the type obviously must be known at compile-time.

As Alexander mentions, the snapshot version of Typed Racket exports typed/json, 
but it just uses 'null for all null values, mostly to sidestep this problem, 
and because custom nulls are relatively pointless, anyway.

> On Jan 17, 2015, at 18:20, Jordan Johnson <j...@fellowhuman.com> wrote:
> 
> Hi all,
> 
> In playing with TR this evening, I found
> 
>> (define-type (Foo A)
>>  (U A
>>     (List 'foo (Foo A))))
>> 
>> (define-predicate foo? Foo)
> 
> generates the error “Type Foo could not be converted to a contract: cannot 
> generate contract for non-function polymorphic type”. I’ve read the page with 
> caveats about inference and polymorphic types, but since the example is about 
> using a function rather than defining a predicate, I’m not clear on how (if 
> at all) the technique could be adapted for this.
> 
> (What I was actually doing, by the way, was seeing if I could port the JSON 
> library to TR. I ran into the problem of the null element being of arbitrary 
> type.)
> 
> Best,
> jmj
> 
> 
> ____________________
>  Racket Users list:
>  http://lists.racket-lang.org/users

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to