Я хочу написать функцию, которая работает с любым значением, которое может быть добавлено к другим членам своего типа (что бы «добавлено» не значило в контексте). Очевидное (хе-хе) определение такого типа:
type Addable = { def +(a : Addable) : Addable }
Это дает мне ошибку, которую я совсем не понимаю: рекурсивный метод + нужен тип результата
Почему это не последний : Addable
тип результата? Почему он все равно считает + рекурсивным?
Но я нашел более общую проблему, пытаясь сослаться на тип внутри его собственного определения:
type T = { def f: T }
Но тогда у меня возникла мозговая волна: решай ее так, как я бы на Яве!
type T[T] = { def f: T }
Это скомпилировано!
Но теперь у меня есть еще две проблемы.
Во-первых, я понятия не имею, как использовать тип T. В частности,
def n(a:T) = a.f
дает совершенно разумную, но разочаровывающую ошибку "тип T принимает параметры типа".
Во-вторых, пытаясь применить этот шаблон к исходной задаче
type Addable[Addable] = { def +(a : Addable) : Addable }
приводит к совершенно непонятному «тип параметра в структурном уточнении может не относиться к абстрактному типу, определенному вне этого уточнения». (На самом деле проблема не в том, что это "+" - слава Богу и Мартину, поскольку это полностью испортило бы мою голову - просто то, что он принимает Addable в качестве параметра.)
So
- Как определить значение типа «утка», означающее «имеет определенную функцию, возвращающую значение того же типа»?
- Как определить значение типа «утка»: «имеет определенную функцию, принимающую выражение того же типа, что и параметр»?
У меня есть религиозное убеждение, что эта проблема разрешима.