8

次のように、ハッシュテーブルの値に関数をマップしたい:

(hash-map add1 (hash "apple" 1 "pear" 2))
=> #hash(("apple" . 2) ("pear" . 3))

これを行うライブラリ関数はありますか?不変のハッシュテーブルでも機能するものがあるとよいでしょう。

私は PlanetT を見ましたが、そこには何も見えませんでした。

これが本当に存在しない場合は、先に進んで書きます。これをラケットに入れる際のマナーは?github でフォークして、標準ライブラリ (およびドキュメント!) に追加し、プル リクエストを送信するだけですか? それとも、最初にplaneTにしてから、移動を依頼する必要がありますか? 助けてあげたいのですが、何が「適切な」方法なのかわかりません。

4

4 に答える 4

8

ハッシュマップがありますが、リストを返します[ 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))

あなたが興味を持っているかもしれないもう一つの形式はfor/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でフォークし、プルリクエストを送信することです。

于 2013-01-31T18:58:21.253 に答える
2

in-hash-valuesを使用してハッシュテーブルの値を反復処理し、通常のforループを使用してそれらをマッピングできます。この関数はハッシュを受け取り、値のシーケンスを返します。このシーケンスは、ループin-hash-valuesでトラバースできます。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)))
于 2013-01-31T18:58:55.403 に答える
2

hash-mapRacketでは、高次のプロシージャを使用できます。これは通常、パラメータとして受け取ったプロシージャの適用から得られた値のリストを返しますが、マップをインプレースで変更するように適合させることができます。例えば:

(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))
于 2013-01-31T18:54:51.213 に答える
2

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))
于 2013-01-31T21:11:29.763 に答える