3.11 Map
On this page:
3.11.1 Map定义
Map?
Map/  c
Map
3.11.2 Map构造函数
hashmap
list->map
map-empty
map-singleton
3.11.3 Map更新
map-insert
map-remove
map-adjust
map-update
map-alter
3.11.4 Map取值
map-key?
map-get
map-keys
map-values
map-size
3.11.5 Map转换
map-filter
map-filter-key
map-union
3.11.6 Map解构
map->list
map->hash
map-fold
map-fold/  key
map-fold/  value
3.11.7 Map语法糖
8.12

3.11 Map🔗

azelf内置Map,取代racket的hash。 所谓HashMap,相当于JavasScript中的Object、TypeScript中的Recrod。

3.11.1 Map定义🔗

procedure

(Map? a)  boolean?

  a : any/c
是否为Map。

procedure

(Map/c k v)  contract?

  k : any/c
  v : any/c
contract构造器。

syntax

(Map pattern ...)

Map模式匹配关键字,使用与hash-table一致。

Examples:
> (match map-empty [(Map) #t])

#t

> (match (hashmap 1 2 3 4) [(Map (k v) ...) k])

'(1 3)

3.11.2 Map构造函数🔗

procedure

(hashmap key value ...)  (Map/c k v)

  key : k
  value : v
构造新的Map?

Examples:
> (hashmap 1 2 3 4)

(Map '(1 . 2) '(3 . 4))

> (hashmap (array 1) 1 (array 2) 2)

(Map '(#<Array: 1> . 1) '(#<Array: 2> . 2))

procedure

(list->map xs)  (Map/c k v)

  xs : (listof (cons/c k v))
从列表中生成Map?

Example:
> (list->map '((1 2) (3 4)))

(Map '(1 2) '(3 4))

value

map-empty : Map?

空Map。

procedure

(map-singleton key value)  (Map/c k v)

  key : k
  value : v

Example:
> (map-singleton 1 2)

(Map '(1 . 2))

3.11.3 Map更新🔗

procedure

(map-insert key value hash)  (Map/c k v)

  key : k
  value : v
  hash : (Map/c k v)
插入一个值,已存在则覆盖。

Examples:
> (map-insert 2 10 (map-singleton 1 1))

(Map '(1 . 1) '(2 . 10))

> (map-insert 1 10 (map-singleton 1 1))

(Map '(1 . 10))

procedure

(map-remove key hash)  (Map/c k v)

  key : k
  hash : (Map/c k v)
删除一个值。

Examples:
> (map-remove 2 (map-singleton 1 1))

(Map '(1 . 1))

> (map-remove 1 (map-singleton 1 1))

(Map)

procedure

(map-adjust f k hash)  (Map/c k v)

  f : (-> v v)
  k : Ord?
  hash : (Map/c k v)

Examples:
> (define (++ s) (string-append "new" s))
> (map-adjust ++ 5 (hashmap 5 "a" 3 "b"))

(Map '(3 . "b") '(5 . "newa"))

> (map-adjust ++ 7 (hashmap 5 "a" 3 "b"))

(Map '(3 . "b") '(5 . "a"))

> (map-adjust ++ 7 map-empty)

(Map)

procedure

(map-update f k hash)  (Map/c k v)

  f : (-> v (Maybe/c v))
  k : Ord?
  hash : (Map/c k v)
f返回Nothing表示删除该键值;返回Just表示更新。

Examples:
> (define (madd1 x)
    (if (= x "a")
        (Just "new a")
        nothing))
> (map-update madd1 5 (hashmap 5 "a" 3 "b"))

(Map '(3 . "b") '(5 . "new a"))

> (map-update madd1 7 (hashmap 5 "a" 3 "b"))

(Map '(3 . "b") '(5 . "a"))

> (map-update madd1 3 (hashmap 5 "a" 3 "b"))

(Map '(5 . "a"))

procedure

(map-alter f k hash)  (hash (Map/c k v))

  f : (-> (Maybe/c v) (Maybe/c v))
  k : Ord?
  hash : (Map/c k v)
集增、删、改一体的函数,具体行为由f控制。

Examples:
> (define h (hashmap 1 2 3 4))
> (define (remove-key v) nothing)
> (define (update-key v) (Just 10))
> (map-alter remove-key 3 h)

(Map '(1 . 2))

> (map-alter update-key 1 h)

(Map '(1 . 10) '(3 . 4))

3.11.4 Map取值🔗

procedure

(map-key? key hash)  boolean?

  key : k
  hash : (Map/c k v)

Examples:
> (map-key? 1 map-empty)

#f

> (map-key? 2 (map-singleton 2 1))

#t

procedure

(map-get key hash)  (Maybe/c v)

  key : k
  hash : (Map/c k v)

Examples:
> (map-get 1 map-empty)

(Nothing)

> (map-get 1 (hashmap 1 2))

(Just 2)

procedure

(map-keys hash)  (Array/c k)

  hash : (Map/c k v)
(map-values hash)  (Array/c v)
  hash : (Map/c k v)
不多解释。

procedure

(map-size hash)  exact-nonnegative-integer?

  hash : Map?
Map总键值对数量。

Example:

3.11.5 Map转换🔗

procedure

(map-filter f hash)  (Map/c k v)

  f : (-> v boolean?)
  hash : (Map/c k v)
(map-filter-key f hash)  (Map/c k v)
  f : (-> k boolean?)
  hash : (Map/c k v)
过滤Map

Examples:
> (map-filter-key odd? (hashmap 1 3 2 2 4 5 7 6))

(Map '(1 . 3) '(7 . 6))

> (map-filter-key even? (hashmap 1 3 2 2 4 5 7 6))

(Map '(2 . 2) '(4 . 5))

procedure

(map-union ha hb)  (Map/c k v)

  ha : (Map/c k v)
  hb : (Map/c k v)
合并两个Map,hbha覆盖。

Example:
> (map-union (hashmap 1 2 3 4) (hashmap 2 3 1 4))

(Map '(1 . 4) '(2 . 3) '(3 . 4))

3.11.6 Map解构🔗

procedure

(map->list h)  (listof (cons/c k v))

  h : (Map/c k v)

Example:
> (map->list (hashmap 1 2 3 4))

'((1 . 2) (3 . 4))

procedure

(map->hash h)  (hash/c k v)

  h : (Map/c k v)

Example:
> (map->hash (hashmap 1 2 3 4))

'#hash((1 . 2) (3 . 4))

procedure

(map-fold f acc h)  a

  f : (-> a k v a)
  acc : a
  h : (Map/c k v)
(map-fold/key f acc h)  a
  f : (-> a k a)
  acc : a
  h : (Map/c k v)
(map-fold/value f acc h)  a
  f : (-> a v a)
  acc : a
  h : (Map/c k v)
类似于foldl,不过它作用在map?上。

Examples:
> (map-fold list '() (hashmap "a" "b" "c" "d"))

'((() "c" "d") "a" "b")

> (map-fold/value list '() (hashmap "a" "b" "c" "d"))

'((() "d") "b")

3.11.7 Map语法糖🔗

azelf提供了类似于JavaScript的object定义语法:

{ 1 2 }
{ 1 (array 1 2) }
(map-size {})