В Mercury я могу использовать:
A = B^some_field := SomeValue
связать A с копией B, за исключением того, что some_field
является SomeValue
вместо того, что было в B. Я считаю, что эквивалент Haskell выглядит примерно так:
a = b { some_field = some_value }
Есть ли у Scala что-то подобное для "модификации" неизменяемых значений. Альтернативой, похоже, является конструктор, который непосредственно устанавливает каждое поле в экземпляре, что не всегда идеально (если есть инварианты, которые должен поддерживать конструктор). Плюс это было бы действительно неуклюже и намного более хрупким, если бы я должен явно передать любое другое значение в экземпляре, в котором я хочу иметь измененную копию.
Я ничего не мог найти по этому поводу в googling или в кратком обзоре справочного руководства по языку или "Scala по примеру" (который я прочитал от начала до конца, но не впитал все тем не менее, поэтому он может быть там).
Я вижу, что эта функция может иметь некоторые странные взаимодействия с защитой и подклассами в стиле Java, хотя...