Функции обновления в Ha sh Table in Racket - PullRequest
1 голос
/ 29 мая 2020

Я новичок в Racket и пытаюсь обновить таблицу ha sh с помощью ha sh -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

Есть предложения?

1 Ответ

1 голос
/ 29 мая 2020

Это связано с тем, что средство обновления должно быть функцией, которая принимает значение в качестве входных данных и производит новое значение на выходе. Поскольку набор является изменяемым, и вы используете set-add! для его изменения, «средство обновления» не возвращает новое значение, а просто изменяет старое и создает пустоту.

Есть два способа исправить это:

  1. Изменяемые наборы как значения, изменять их отдельно, а не внутри hash-update!.
  2. Неизменяемые наборы как значения, используйте функциональное средство обновления внутри hash-update!.

Поскольку вы указали, что хотите, чтобы значения были изменяемыми наборами, я покажу (1).

Самый простой c вы можете сделать это 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)

Хотя, вероятно, было бы лучше, если бы вы обернули результат отказа в преобразователе

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