Batasan apa yang ditempatkan skala pada "kompleksitas yang dapat diterima" dari tipe-tipe yang disimpulkan?

120

Menurut Spesifikasi Bahasa Scala :

... inferensi tipe lokal diizinkan untuk membatasi kompleksitas batas yang disimpulkan [parameter tipe]. Minimitas dan maksimalitas jenis harus dipahami relatif terhadap himpunan jenis kompleksitas yang dapat diterima.

Dalam praktiknya apa saja batasannya?

Selain itu, apakah ada batas berbeda yang berlaku untuk jenis ekspresi yang disimpulkan daripada batas jenis parameter, dan apa batas tersebut?

Owen
sumber
2
blog ini memiliki beberapa diskusi menarik tentang topik ini
Jamil
20
Saya akan menyarankan untuk memposting ke milis bahasa-scala yang disebutkan di sini: scala-lang.org/node/199
Dave L.
1
Saya tidak yakin, tapi menurut saya artinya misalnya kita memiliki daftar string dan kita menambahkan int ke dalamnya. Daftar tetap yang dikembalikan pada akhirnya berjenis "Apa saja". Jadi maksimalitas jenis
Jatin
8
Ini sebenarnya adalah target bergerak karena versi berbeda dari kompiler Scala memiliki batasan yang berbeda. Ini telah berubah dan saya berharap akan terus berubah setidaknya dalam waktu dekat karena bahasa terus berkembang. Saya memilih pertanyaan ini ke bawah karena tidak dapat dijawab seperti yang dinyatakan saat ini.
Kevin Sitze
1
@ Kevin Memang benar. Saya rasa saya paling tertarik dengan scala 2.9, karena ini terbaru tetapi stabil. Tapi saya bertanya-tanya berapa banyak yang akan berubah.
Owen

Jawaban:

10

Saat menyimpulkan tipe, compiler sering kali perlu menghitung Least Upper Bound (LUB) dari daftar tipe. Misalnya, tipe if (cond) e1 else e1adalah LUB dari tipe e1dan e1.

Jenis ini bisa menjadi cukup besar, misalnya coba ini di 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]...

Komitmen ini memperkenalkan beberapa pemeriksaan kewarasan untuk membatasi kedalaman tipe yang disimpulkan tersebut.

Ada beberapa pekerjaan baru-baru ini untuk dimasukkan ke dalam proses kompilasi untuk mendeteksi tipe yang disimpulkan yang membutuhkan waktu lama untuk dihitung, dan menyarankan tempat di mana anotasi tipe eksplisit mungkin lebih bijaksana.

retronim
sumber