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