【问题标题】:Update functions in Hash Table in Racket更新 Racket 哈希表中的函数
【发布时间】:2020-09-17 04:56:59
【问题描述】:

我是 Racket 的初学者,我正在尝试使用哈希更新来更新哈希表!其中值是一个可变集合。以下是代码行:

(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】:

    这是因为更新器应该是一个函数,它将一个值作为输入并产生一个新的值输出。由于该集合是可变的,并且您正在使用 set-add! 对其进行变异,因此“更新程序”不会返回新值,只是变异旧值并产生 void。

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

    1. 可变集合作为值,单独改变它们,不在hash-update!内部。
    2. 不可变集合作为值,在hash-update! 中使用功能更新程序。

    由于您指定要将值作为可变集,我将显示 (1)。

    您可以做的最基本的事情是hash-ref 获得一个可变集,然后在上面使用set-add!

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

    但是,当该键还没有可变设置值时,这不起作用。当它尚不存在时,需要将其添加到表中,这就是为什么您有 (mutable-set 1) failure-result 参数的原因。这个问题的解决方案不是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)
    

    【讨论】:

    • 非常感谢!在这个问题上卡了很久。非常感谢!
    猜你喜欢
    • 2018-03-17
    • 2019-02-11
    • 2017-01-22
    • 2016-03-25
    • 2011-02-27
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多