更新Racket中哈希表的功能

问题描述 投票:1回答:1

我是一个Racket的初学者,我想用hash-update!来更新一个哈希表,其中的值是一个可变的集合。下面是代码行。

(hash-update! hash key (curryr set-add! new_val) (mutable-set 1))

但是我收到一个错误

 expected: set?
given: #<void>
argument position: 1st
other arguments...:
  x: 2

其中我试过用2作为new_val

有什么建议吗?

functional-programming scheme lisp racket
1个回答
1
投票

这是因为update器应该是一个函数,它把一个值作为输入,并产生一个新的值输出。由于集合是可变的,而你使用的是 set-add! 来突变它,"updater "并没有返回一个新的值,只是将旧的值突变并产生void。

有两种方法可以解决这个问题。

  1. 把可变集作为值,分别进行突变,而不是在里面 hash-update!.
  2. 不可变集作为值,在内部使用功能更新器。hash-update!.

由于你指定了你想要的值是可变集,我将显示(1)。

你可以做的最基本的事情是 hash-ref 得到一个可变集,然后用 set-add! 上。

(set-add! (hash-ref hash key) new-val)

然而,当该键还没有可变集的值时,这就不行了。当它还不存在时,它需要被添加到表中,这就是为什么你有 (mutable-set 1) 失败-结果争论。解决这个问题的方法不是 hash-update!,它是 hash-ref!.

(set-add! (hash-ref! hash key (mutable-set 1)) new-val)

虽然如果你把失败的结果用thunk包起来可能会更好。

(set-add! (hash-ref! hash key (λ () (mutable-set 1))) new-val)
© www.soinside.com 2019 - 2024. All rights reserved.