Wouldn’t that possibility then have to be part of the type for the values in 
the hash? Maybe I don’t understand how types work for hashes.

In this code:

#lang typed/racket

(define h : (Immutable-HashTable Integer (-> String))
  (make-immutable-hash))

(hash-ref h
          2
          (thunk "Hit and miss"))

I think I’ve set the type of the values of the hash h to be a thunk that 
returns a string. I’m then trying to access a key in that hash, which misses 
because the hash has no keys. The third argument works because it’s a function 
that happens to return a string. It’s funny because it looks like it 
type-checks, but it doesn’t really.

This code:

#lang typed/racket

(define h : (Immutable-HashTable Integer String)
  (make-immutable-hash))

(hash-ref h
          2
          (thunk "Hit and miss"))

also type-checks because even though the third argument to hash-ref is not a 
String, it is a function.

Oddly, to me at least,

#lang typed/racket

(define h : (Immutable-HashTable Integer String)
  (make-immutable-hash))

(hash-ref h
          2
          "Hit and miss")

Does not type check even though the type of the hash’s values is String, the 
same as the third argument of hash-ref.

> On 24 Nov 2020, at 14:44, Sam Tobin-Hochstadt <sa...@cs.indiana.edu> wrote:
> 
> Unfortunately, that doesn't work -- the values in the hash could
> include functions.
> 
> Sam
> 
> On Tue, Nov 24, 2020 at 7:25 AM Tim Jervis <tim.jer...@gmail.com> wrote:
>> 
>> For the type of the third argument, rather than "any non-function", could 
>> Typed Racket use the type of the values in the hash?
>> 
>> On Tuesday, 21 April 2020 at 15:51:00 UTC+1 Sam Tobin-Hochstadt wrote:
>>> 
>>> The problem here is with the optional third argument to `hash-ref`.
>>> Typed Racket only allows `#f` or functions as the third argument.
>>> Plain Racket allows any non-function value as a default, or a function
>>> which is called to produce the default. Since "any non-function" is
>>> not expressible in Typed Racket, it's more restricted here.
>>> 
>>> The best option is to wrap the third argument in a thunk: `(lambda () 
>>> 'other)`.
>>> 
>>> As an aside, you probably don't want to use `cast` this extensively in
>>> your program.
>>> 
>>> Sam
>>> 
>>> On Tue, Apr 21, 2020 at 10:35 AM Hendrik Boom <hen...@topoi.pooq.com> wrote:
>>>> 
>>>> In typed Racket I define a hashtable:
>>>> 
>>>> (: vector-to-contract (HashTable TType CContract))
>>>> 
>>>> (define vector-to-contract
>>>> (make-hash
>>>> (cast '(
>>>> (_bytes . bytes?)
>>>> (_s8vector . s8vector?)
>>>> (_u16vector . u16vector?)
>>>> (_s16vector . s16vector?)
>>>> (_u32vector . u32vector?)
>>>> (_s32vector . s32vector?)
>>>> (_u64vector . u64vector?)
>>>> (_s64vector . s64vector?)
>>>> (_f32vector . f32vector?)
>>>> (_f64vector . f64vector?))
>>>> (Listof (Pair TType CContract))
>>>> )
>>>> ))
>>>> 
>>>> And then I try to look something up in it:
>>>> 
>>>> ( hash-ref vector-to-contract (cast '_bytes TType) (cast 'other CContract))
>>>> 
>>>> and I am informed that I cannot, it seems, look up a value of type
>>>> TType in a hastable whose type indicates it looks up things of type
>>>> TType:
>>>> 
>>>> Type Checker: Polymorphic function `hash-ref' could not be applied to 
>>>> arguments:
>>>> Types: HashTableTop a (-> c) -> Any
>>>> HashTableTop a False -> Any
>>>> HashTableTop a -> Any
>>>> Arguments: (HashTable TType CContract) TType CContract
>>>> Expected result: AnyValues
>>>> in: (hash-ref vector-to-contract (cast (quote _bytes) TType) (cast
>>>> (quote other) CContract))
>>>> 
>>>> 
>>>> How *does* one use hashtables in typed Racket?
>>>> 
>>>> -- hendrik
>>>> 
>>>> --
>>>> 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 racket-users...@googlegroups.com.
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/racket-users/20200421143453.lauuqi3pb4fdgyhh%40topoi.pooq.com.
>> 
>> --
>> 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 racket-users+unsubscr...@googlegroups.com.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/racket-users/aacb7226-8a0e-4fe0-9481-c1f72143eec2n%40googlegroups.com.

-- 
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 racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/2B6A277A-5538-4FFB-86E7-48F3D663C90D%40gmail.com.

Reply via email to