Or come to think of it would generalizing value types like (-val ‘null) in this case to for instance Symbol also fix cases like this?
On Jan 19, 2015, at 10:09 AM, Alexander D. Knauth <alexan...@knauth.org> wrote: > If there was a way to convert a “value” type to a more general type, for > instance convert all hash-table value types to HashTableTop, or vector value > types to VectorTop, etc. and then use (not (or (subtype t1 t2) (subtype t2 > t1))) or something like that, could that catch cases like this? > > On Jan 19, 2015, at 9:58 AM, Sam Tobin-Hochstadt <sa...@cs.indiana.edu> wrote: > >> On Mon, Jan 19, 2015 at 9:54 AM, Alexander D. Knauth >> <alexan...@knauth.org> wrote: >>> Would there be a more general solution that wouldn’t be specific to just >>> hash-tables? >> >> I'm not sure what you mean. The code you suggested fixes a >> hash-table-specific limitation in Typed Racket. If the question is >> could `overlap` not have so many cases, then I'd certainly like that, >> but it's very hard to accomplish. In particular, abstractions like >> `Sequence` and `Evt` overlap with arbitrarily many types. A more >> principles treatment of such abstractions would help, but we don't yet >> know how to do that. >> >> Sam >> >>> >>> On Jan 19, 2015, at 9:38 AM, Sam Tobin-Hochstadt <sa...@cs.indiana.edu> >>> wrote: >>> >>>> This is a correct improvement to Typed Racket -- I'll make it shortly. >>>> >>>> Sam >>>> >>>> On Mon, Jan 19, 2015 at 8:41 AM, Alexander D. Knauth >>>> <alexan...@knauth.org> wrote: >>>>> I managed to fix this for your example by inserting these 3 lines into >>>>> typed-racket/types/remove-intersect.rkt after line 67: >>>>> [(list-no-order (Value: (not (? hash?))) >>>>> (or (? Hashtable?) (? HashtableTop?))) >>>>> #f] >>>>> There is probably a better solution though. >>>>> >>>>> On Jan 19, 2015, at 7:36 AM, Alexander D. Knauth <alexan...@knauth.org> >>>>> wrote: >>>>> >>>>> Since hash-tables can be mutable as far as TR knows, (HashTable Symbol >>>>> String) is not a subtype of (HashTable Symbol JSExpr). >>>>> To work around this, you can do this: >>>>> #lang typed/racket/base >>>>> (require typed/json) >>>>> (: jsx JSExpr) ; <-- jsx is what I ultimately want. >>>>> (define jsx (ann #hasheq((a . "val1") (b . "val2") (c . "val3")) >>>>> (HashTable >>>>> Symbol JSExpr))) >>>>> >>>>> Or this would work too: >>>>> #lang typed/racket/base >>>>> (require typed/json) >>>>> (: jsx (HashTable Symbol JSExpr)) ; <-- jsx is what I ultimately >>>>> want. >>>>> (define jsx #hasheq((a . "val1") (b . "val2") (c . "val3"))) >>>>> >>>>> Or you could use (inst make-immutable-hasheq Symbol JSExpr) instead of >>>>> using >>>>> #hasheq, and it would do the same thing. >>>>> >>>>> >>>>> On Jan 19, 2015, at 1:28 AM, Jordan Johnson <j...@fellowhuman.com> wrote: >>>>> >>>>> Hi all, >>>>> >>>>> I’ve been trying to create JSExprs, as defined in the typed/json library. >>>>> This is one of those instances where it seems like I must be making things >>>>> harder than they should be, but I’m still feeling like a duck on >>>>> rollerskates in TR, so I want to make sure I’m not missing an easier way >>>>> to >>>>> do it. >>>>> >>>>> Would you please confirm if this is indeed a smallest-possible solution? >>>>> >>>>> ;;;; begin >>>>> #lang typed/racket/base >>>>> >>>>> (require typed/json) >>>>> >>>>> (: jsx JSExpr) ; <-- jsx is what I ultimately want. >>>>> >>>>> ;; Attempt #1: >>>>> #; >>>>> (define jsx #hasheq((a . "val1") (b . "val2") (c . "val3"))) >>>>> >>>>> #| Resulting error: >>>>> Type Checker: type mismatch >>>>> expected: JSExpr >>>>> given: (HashTable Symbol String) >>>>> >>>>> [This seems weird, since it seems like (HashTable Symbol String) should be >>>>> a subtype of JSExpr. Is the problem that the typechecker can’t recognize >>>>> the Strings as JSExprs?] >>>>> |# >>>>> >>>>> ;; Attempt #N (shortest successful version I’ve found): >>>>> (define jsx >>>>> (for/hasheq : (HashTable Symbol JSExpr) ([k '(a b c)] >>>>> [v '("val1" "val2" "val3")]) >>>>> (values k v))) >>>>> ;;;; end >>>>> >>>>> Regards, >>>>> Jordan >>>>> >>>>> ____________________ >>>>> 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 >>>>> >>> > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users