Jakie ograniczenia nakłada Scala na „dopuszczalną złożoność” wywnioskowanych typów?

120

Zgodnie ze specyfikacją języka Scala :

... wnioskowanie o typie lokalnym jest dozwolone w celu ograniczenia złożoności wywnioskowanych granic [parametrów typu]. Minimalność i maksymalność typów należy rozumieć w odniesieniu do zbioru typów o dopuszczalnej złożoności.

W praktyce jakie są ograniczenia?

Ponadto, czy istnieją inne ograniczenia, które mają zastosowanie do wywnioskowanych typów wyrażeń niż do granic typów parametrów i jakie są te ograniczenia?

piekarnik
źródło
2
ten blog zawiera ciekawą dyskusję na ten temat
Jamil,
20
Sugerowałbym wysłanie posta na listę mailingową w języku scala, o której mowa tutaj: scala-lang.org/node/199
Dave L.
1
Nie jestem pewien, ale myślę, że to znaczy np. Mamy listę ciągów i dodajemy do niej int. Ostatecznie zwrócona lista niezmienna jest typu „Dowolna”. A więc maksymalność typów
Jatin
8
W rzeczywistości jest to ruchomy cel, ponieważ różne wersje kompilatora Scala mają różne ograniczenia. To się zmieniło i spodziewam się, że będzie się zmieniać przynajmniej w najbliższej przyszłości, w miarę rozwoju języka. Głosuję na to pytanie, ponieważ nie można na nie odpowiedzieć, tak jak jest to obecnie określone.
Kevin Sitze
1
@kevin Rzeczywiście. Myślę, że najbardziej interesuje mnie Scala 2.9, ponieważ jest nowa, ale stabilna. Ale zastanawiam się, jak wiele by się zmieniło.
Owen

Odpowiedzi:

10

Podczas wnioskowania o typach kompilator często musi obliczyć najmniejszą górną granicę (LUB) listy typów. Na przykład typ if (cond) e1 else e1to LUB dla typów e1i e1.

Te typy mogą być dość duże, na przykład spróbuj tego w REPL:

:type Map(1 -> (1 to 10), 2 -> (1 to 10).toList)
scala.collection.immutable.Map[Int,scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int] with Serializable{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def takeRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def drop(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def take(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]}; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int]...

To zatwierdzenie wprowadziło pewne kontrole poczytalności, aby ograniczyć głębokość takich wywnioskowanych typów.

Ostatnio wykonano pewne prace nad włączeniem wtyczki do procesu kompilacji w celu wykrycia wywnioskowanych typów, których obliczenie zajmuje dużo czasu, i zasugerowania miejsc, w których jawna adnotacja typu może być rozsądna.

retronim
źródło