Учитывая этот простой фрагмент кода я изумлен, чтобы вызвать переполнение стека это легко:Как предотвратить переполнение стека при использовании в Scala Predef.implicitly
implicit def foobar: Unit = implicitly[Unit]
В моем маленьком более сложном случае использования у меня есть следующий situtation:
abstract class Foo {
type Repr_Tpe
protected implicit def repr2Ordered: Repr_Tpe => Ordered[Repr_Tpe]
}
class Bar extends Foo {
type Repr_Tpe = Long
protected implicit def repr2Ordered = implicitly[Repr_Tpe => Ordered[Repr_Tpe]]
}
метод repr2Ordered
Определение в классе Foo
не работает, потому что тип Repr_Tpe
является абстрактным. Поэтому я решил скопировать & вставить объявление и сделать из него определение; , по-видимому, приводит к переполнению стека сверху. Только удаляя модификатор implicit
из определения в классе Bar
решает эту проблему.
Нет ли элегантного решения, обходящего эту ловушку?
Не мог ли компилятор Scala легко обнаружить эту ситуацию, так как определение находится в процессе определения? –
Причина этой ошибки заключается в том, что вы определяете то, что хотите вернуть. Так что это довольно сложный способ записи рекурсивной функции. Кажется, вы взяли этот пример из контекста. Дополнительная информация о контенте и некоторое объяснение того, что вы действительно пытаетесь заархивировать с помощью этого кода, будут чрезвычайно полезны. – tenshi
Система типа Scala полностью завершена, и эта завершающая полнота является результатом неявного вывода. Это означает, что все, что использует неявный вывод типа, в значительной степени связано с теми же правилами, что и любая запущенная программа, среди которых невозможность предсказать окончание программы - та же самая проблема, которую вы здесь имеете. Что-то можно было сделать для простейших случаев, но не для общего случая. –