Как смешать аннотации в объекте-компаньоне - PullRequest
0 голосов
/ 03 сентября 2018

Рассмотрим следующую ситуацию:

trait  M { } // uses N
object M { def apply = new M { } }
trait  N { self: L =>  }
trait  L { val m: B }
type   B

M нужны новые определения деревьев, созданные в N. Я не хочу передавать эти новые деревья, потому что иерархия классов на самом деле очень длинная и может привести к значительному изменению кода. Вместо этого мне предложили сделать:

trait  M { self: N with L => } // uses N
object M { def apply = new M with N with L { } }
trait  N { self: L => }
trait  L { val m: B }
type   B

но тогда я получаю ошибку:

создание объекта невозможно, так как значение m в признаке L типа B не является определен

это исходит из определения объекта М. Я пробовал разные комбинации, и ни одна из них не работает.

Как я могу решить эту ошибку?

Обсуждение

Я узнаю, что при написании new M {} я получаю анонимный класс, расширяющий (объект ??) M, поэтому я попытался изменить его на new M with N with L {}, но затем я получаю ошибку невыполненных членов от L.

Ссылки

Более подробную информацию о проблеме вы можете найти в этом коммите . А именно, тип M - это MeasureAnnotation, N - это StructuralSize, а L - это SolverProvider.

Если вы хотите собрать программу, вам нужно выполнить git clone, а затем запустить sbt, а затем universal:stage. Вам нужно установить z3 или cvc4.

1 Ответ

0 голосов
/ 03 сентября 2018

Я думаю, что ваш фрагмент кода не точно отражает ваш фактический коммит. В коммите вы также использовали тип self для объекта, что не имеет смысла. Самостоятельный тип признака описывает требование, которому должны удовлетворять конкретные экземпляры, смешивающиеся в этом признаке. Однако объект уже является конкретным типом, поэтому нет смысла определять дальнейшие требования.

Короче говоря: не повторяйте самотип с черты на его объекте-компаньоне.

...