如何映射哈希表(球拍)的值

The*_*ire 7 scheme hashtable racket

我想将函数映射到哈希表中的值,如下所示:

(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))
Run Code Online (Sandbox Code Playgroud)

是否有库函数来执行此操作?有一个人也可以使用不可变的hashetables.

我看着PlaneT,但没有看到任何东西.

现在,如果这确实不存在,我会继续写下来.把这个变成球拍的礼节是什么?我只是将它分叉在github上并将其添加到标准库(和文档!)并提交拉取请求?或者我应该先把它作为一个飞机,然后要求它被移入?我想帮忙,但我不知道什么是'正确'的方式去做.

stc*_*ang 7

有一个哈希映射,但它返回一个列表[ 1 ]

您必须自己编写hash-map才能完全按照自己的意愿行事.

#lang racket

(define (new-hash-map f h)
  (make-immutable-hash (hash-map h (? (k v) (cons k (f v))))))

(new-hash-map add1 (hash "apple" 1 "pear" 2))

; => '#hash(("pear" . 3) ("apple" . 2))
Run Code Online (Sandbox Code Playgroud)

您可能感兴趣的另一种形式是/ hash [ 2 ]:

#lang racket

(define (new-hash-map2 f h)
  (for/hash ([(k v) (in-hash h)]) (values k (f v))))

(new-hash-map2 add1 (hash "apple" 1 "pear" 2))

; => '#hash(("pear" . 3) ("apple" . 2))
Run Code Online (Sandbox Code Playgroud)

如果您觉得这个功能应该包含在Racket中,那么非常欢迎补丁!贡献的最佳方式是在github上分叉并提交拉取请求.


Sha*_*awn 1

在这个问题被提出很多年之后,Racket 8.6 添加了hash-map/copy这个功能。它将现有哈希表的键和值传递给返回两个值的映射函数 - 在新返回的表中使用的新键和值。

> (hash-map/copy (hash "apple" 1 "pear" 2) (lambda (k v) (values k (+ v 1))))
'#hash(("apple" . 2) ("pear" . 3))
Run Code Online (Sandbox Code Playgroud)