Ölçek, çıkarsanan türlerin "kabul edilebilir karmaşıklığına" ne gibi sınırlar koyar?


120

Scala Dil Spesifikasyonuna Göre :

... yerel tür çıkarımına, çıkarsanan sınırların [tür parametrelerinin] karmaşıklığını sınırlandırmasına izin verilir. Tiplerin minimum ve maksimumluğu, kabul edilebilir karmaşıklık türleri dizisine göre anlaşılmalıdır.

Pratikte sınırlar nelerdir?

Ayrıca, çıkarsanan ifade türleri için parametre türü sınırlarından farklı sınırlar var mı ve bu sınırlar nelerdir?


2
Bu blogda bu konuyla ilgili ilginç tartışmalar var
Jamil

20
Burada belirtilen scala dili posta listesine gönderi göndermenizi öneririm: scala-lang.org/node/199
Dave L.

1
Emin değilim, ama bunun örneğin bir dizge listemiz olduğu ve buna bir int ekledik anlamına geldiğini düşünüyorum. Döndürülen değişmez liste nihayetinde "Herhangi biri" türündedir. Türlerin
maksimumluğu

8
Scala derleyicisinin farklı sürümleri farklı sınırlara sahip olduğundan, bu aslında hareketli bir hedeftir. Bu değişti ve dil gelişmeye devam ettikçe en azından yakın vadede değişmeye devam edeceğini umuyorum. Bu soruyu olumsuz oyluyorum çünkü şu anda belirtildiği gibi cevaplanamıyor.
Kevin Sitze

1
@kevin Doğru gerçekten. Sanırım en çok 2.9 skala ile ilgileniyorum, çünkü yeni fakat istikrarlı. Ama ne kadar değişeceğini merak ediyorum.
Owen

Yanıtlar:


10

Türleri çıkarırken, derleyicinin genellikle bir tür listesinin En Az Üst Sınırını (LUB) hesaplaması gerekir. Örneğin, tip if (cond) e1 else e1türlerinin LUB olan e1ve e1.

Bu türler oldukça büyük olabilir, örneğin bunu bir REPL'de deneyin:

: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]...

Bu taahhüt , bu tür çıkarsanan türlerin derinliğini sınırlamak için bazı mantıklı kontroller getirdi.

Hesaplanması uzun zaman alan çıkarılan türleri tespit etmek ve açık bir tür ek açıklamasının ihtiyatlı olabileceği yerleri önermek için derleme sürecine eklenti yapmak için yeni çalışmalar yapılmıştır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.