我想将函数映射到散列表中的值,如下所示:
(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))
是否有库函数来执行此操作?有一个人也可以使用不可变的hashetables。
我看着PlaneT,但没有看到任何东西。
现在,如果这确实不存在,我会继续写下来。把这个变成球拍的礼节是什么?我只是将它分叉在github上并将其添加到标准库(和文档!)并提交拉取请求?或者我应该先把它作为一个飞机,然后要求它被移入?我想帮忙,但我不知道什么是'正确'的方式去做。
答案 0 :(得分:6)
有一个哈希映射,但它返回一个列表[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))
您可能感兴趣的另一种形式是/ 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))
如果您觉得这个功能应该包含在Racket中,那么非常欢迎补丁!贡献的最佳方式是在github上分叉并提交拉取请求。
答案 1 :(得分:2)
在Racket中,您可以使用hash-map
更高阶的过程,该过程通常会返回一个列表,其中包含作为参数接收的过程的应用所产生的值,但它可以适用于就地修改地图。例如:
(define h (make-hash))
(hash-set! h "apple" 1)
(hash-set! h "pear" 2)
h
=> '#hash(("pear" . 2) ("apple" . 1))
诀窍是传递具有适当功能的lambda
:
(hash-map h (lambda (key value)
(let ((newval (add1 value)))
(hash-set! h key newval)
newval)))
h
=> '#hash(("pear" . 3) ("apple" . 2))
要获得更通用的解决方案,请尝试以下实现:
(define (mutable-hash-map! hash proc)
(hash-map hash (lambda (key value)
(hash-set! hash key (proc value))))
(void))
答案 2 :(得分:1)
您可以使用in-hash-values迭代哈希表的值,并使用常规for loops来映射它们。函数in-hash-values
接受一个哈希并返回一个值序列,然后可以使用for
循环遍历这些值。
示例:
(for/list ([elt (in-hash-values (hash "apple" 1 "pear" 2))])
(add1 elt))
同样,你可以使用sequence-map,虽然你得到的是另一个序列而不是列表:
(sequence-map add1 (in-hash-values (hash "apple" 1 "pear" 2)))
答案 3 :(得分:1)
由于 hash-map 会创建一个此处不需要的列表,我宁愿使用 hash-for-each 。
(define (hash-update-all! h func)
(hash-for-each
h
(lambda (k v) (hash-set! h k (func v)))))
(define table (make-hash '((a . 1) (b . 2) (c . 3))))
(hash-update-all! table (curry * 100))
table
==> '#hash((c . 300) (a . 100) (b . 200))
编辑:我忘了 for 可以处理哈希表:
(define (hash-update-all! h func)
(for ([(k v) h]) (hash-set! h k (func v))))
(hash-update-all! table (curryr / 10))
table
==> '#hash((c . 30) (a . 10) (b . 20))