Вы правы, что оператор match
будет выполнять только первое совпадение case
, он не будет проверять или выполнять более поздние совпадения (в противном случае case _
всегда будет выполняться).
Существуетнет «обходного пути», потому что это не ошибка или ограничение, это очень полезная функция языка.
Звучит так, как будто у вас есть несколько различных trait
с.каждый из которых имеет различное поведение, и вы хотите выполнить поведение для всех черт.
Лучший способ сделать это - написать отдельные функции для сопоставления с каждой чертой (Sum
Var
и т. д.)и вызывайте их один за другим в экземпляре Tree
.Вы можете сделать последовательность из них и использовать foldLeft
, чтобы применить каждый из них по очереди.Поскольку ваша функция derive
возвращает новый экземпляр Tree
, вам необходимо четко определить, в каком порядке вы хотите применить операции.
Мне остается неясным, почему у вас есть один объект, который представляет собой Var
и Const
, поэтому я подозреваю, что есть более глубокая проблема с вашими структурами данных.