Сценарий: Я анализирую IL и хочу, например, преобразовать из представления на основе стека в CFG.Классы классов Scala в коллекциях
My IL состоит из нескольких операций, таких как PushInt (значение), Pop и т. Д. Вопрос в том, какая реализация будет правильной с точки зрения Scala. Я хотел бы использовать тематические классы/объекты или экстракторы, так что я могу написать код ALA
op match {
case PushInt(x) => doSomethingWith x
case Pop => ...
}
Теперь проблема существует с последовательностью, как PushInt(1) :: PushInt(1) :: Pop :: Pop
так PushInt (1) равно PushInt (1), и я не могу добавьте несколько (равных) операций в коллекцию. Однако я знаю, что я выбрасываю некоторую информацию, которая является позицией в потоке, но она неявно сохраняется как индекс te в последовательности.
Одним из возможных решений является переопределить метод hashCode и нарушить правила равенства/hashCode. Я не очень доволен этим.
Другой вариант должен иметь «время создания» счетчик, который хранится в абстрактной базе, так что
case class PushInt(value: Int) extends AbstractOp(AbstractOp.nextIndex)
использования экстракторов, но в этом случае я буду скучать хорошие возможности, как реализации хэш-код, равно, toString и, что еще важнее, проверить исчерпывающий матч.
Так что теперь мой вопрос заключается в том, как смоделировать мою структуру в соответствии с моими требованиями. Является ли какое-либо из возможных решений «правильным» с точки зрения Scala?
Вы не можете добавить несколько одинаковых операций в коллекцию? Разве это не только в том случае, если коллекция представляет собой набор? –
Нет, и еще хуже спросить indexOf в последовательности. Что, конечно, правильно, если объекты равны. –
В списке можно, конечно, повторять одинаковые элементы. –