我是一个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
有什么建议吗?
这是因为update器应该是一个函数,它把一个值作为输入,并产生一个新的值输出。由于集合是可变的,而你使用的是 set-add!
来突变它,"updater "并没有返回一个新的值,只是将旧的值突变并产生void。
有两种方法可以解决这个问题。
hash-update!
.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)