Scheme 如何映射哈希表(racket)的值

Scheme 如何映射哈希表(racket)的值,scheme,hashtable,racket,Scheme,Hashtable,Racket,我想将函数映射到哈希表中的值上,如下所示: (hash-map add1 (hash "apple" 1 "pear" 2)) => #hash(("apple" . 2) ("pear" . 3)) 是否有库函数来执行此操作?如果有一个也能在不可变哈希表上工作,那就太好了 我在地球上看了看,但什么也没看到 现在,如果这真的不存在,我会继续写下去。把这个放进球拍的礼节是什么?我只是把它放到github上,然后将它添加到标准库(和文档!),然后提交一个拉取请求?或者我应该先把它变成一颗行星

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

(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))
是否有库函数来执行此操作?如果有一个也能在不可变哈希表上工作,那就太好了

我在地球上看了看,但什么也没看到

现在,如果这真的不存在,我会继续写下去。把这个放进球拍的礼节是什么?我只是把它放到github上,然后将它添加到标准库(和文档!),然后提交一个拉取请求?或者我应该先把它变成一颗行星,然后要求把它搬进去?我很想帮忙,但我只是不知道怎么做才是“正确的”方式

在Racket中,您可以使用高阶过程,该过程通常返回一个列表,其中包含作为参数接收的过程应用所产生的值,但它可以进行调整以就地修改贴图。例如:

(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))

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

您必须编写自己的
哈希映射
,才能完全按照自己的意愿进行操作

#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))
您可能感兴趣的另一种形式是for/hash[]:


如果你觉得这个功能应该包括在球拍中,补丁是最受欢迎的!最好的贡献方式是在github上分叉并提交一个pull请求。

您可以使用遍历哈希表的值,并使用regular在它们之间进行映射。hash values中的函数
接受一个hash并返回一个值序列,然后可以使用
for
循环遍历该值序列

例如:

(for/list ([elt (in-hash-values (hash "apple" 1 "pear" 2))])
  (add1 elt))
类似地,您可以使用,尽管您得到的是另一个序列,而不是列表:

(sequence-map add1 (in-hash-values (hash "apple" 1 "pear" 2)))

由于散列映射创建了一个这里不需要的列表,因此我宁愿对每个使用散列

(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))

irc频道的stamourv还推荐了/hash的
,这就是我最终使用的。“非常感谢。”西奥贝莱尔用了什么样的理由来推荐它?现在,我看不出这两种变体有什么好处。那是很久以前的事了,我也不记得了。我认为它不必先构造一个列表,然后再构造一个哈希表,但这可能是错误的。
(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))