สกาลามีข้อ จำกัด อะไรบ้างสำหรับ "ความซับซ้อนที่ยอมรับได้" ของประเภทที่อนุมาน


120

ตามข้อกำหนดภาษาสกาล่า :

... การอนุมานประเภทท้องถิ่นได้รับอนุญาตเพื่อจำกัดความซับซ้อนของขอบเขตที่อนุมาน [ของพารามิเตอร์ประเภท] ต้องเข้าใจ Minimality และ Maximality เมื่อเทียบกับชุดของประเภทของความซับซ้อนที่ยอมรับได้

ในทางปฏิบัติมีข้อ จำกัด อะไรบ้าง?

นอกจากนี้ยังมีขีด จำกัด ที่แตกต่างกันที่ใช้กับประเภทนิพจน์ที่อนุมานมากกว่าขอบเขตประเภทพารามิเตอร์และขีด จำกัด เหล่านั้นคืออะไร


2
บล็อกนี้มีการสนทนาที่น่าสนใจในหัวข้อนี้
Jamil

20
ฉันขอแนะนำให้โพสต์ในรายชื่อส่งเมลภาษาสกาล่าที่กล่าวถึงที่นี่: scala-lang.org/node/199
Dave L.

1
ฉันไม่แน่ใจ แต่ฉันคิดว่ามันหมายความว่าตัวอย่างเช่นเรามีรายการสตริงและเราเพิ่ม int เข้าไป รายการที่ไม่เปลี่ยนรูปที่ส่งคืนในที่สุดจะเป็นประเภท "ใด ๆ " ประเภทสูงสุดดังนั้น
Jatin

8
นี่เป็นเป้าหมายที่เคลื่อนที่ได้เนื่องจากคอมไพเลอร์ Scala เวอร์ชันต่างๆมีขีด จำกัด ที่แตกต่างกัน สิ่งนี้มีการเปลี่ยนแปลงและฉันคาดว่าจะมีการเปลี่ยนแปลงอย่างน้อยในอนาคตอันใกล้เนื่องจากภาษายังคงพัฒนาต่อไป ฉันโหวตคำถามนี้เนื่องจากไม่สามารถตอบคำถามได้ตามที่ระบุไว้ในขณะนี้
Kevin Sitze

1
@kevin แท้แน่นอน. ฉันคิดว่าฉันสนใจ scala 2.9 มากที่สุดเนื่องจากเป็นรุ่นล่าสุด แต่เสถียร แต่ฉันสงสัยว่าจะเปลี่ยนไปมากแค่ไหน
Owen

คำตอบ:


10

เมื่ออนุมานประเภทคอมไพลเลอร์มักจะต้องคำนวณ Least Upper Bound (LUB) ของรายการประเภท ยกตัวอย่างเช่นประเภทของการif (cond) e1 else e1เป็น LUB ประเภทของและe1e1

ประเภทเหล่านี้อาจมีขนาดค่อนข้างใหญ่ตัวอย่างเช่นลองใช้ใน 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]...

การกระทำนี้นำมาซึ่งการตรวจสอบความมีสติเพื่อจำกัดความลึกของประเภทที่อนุมานดังกล่าว

มีงานล่าสุดบางอย่างในการใช้ปลั๊กอินไปยังกระบวนการคอมไพล์เพื่อตรวจหาประเภทที่อนุมานซึ่งใช้เวลาคำนวณนานและแนะนำสถานที่ที่อาจต้องใช้คำอธิบายประกอบประเภทที่ชัดเจน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.