2012-07-11 29 views
122

Theo Scala Language Spec:Những giới hạn nào xảy ra đối với "độ phức tạp chấp nhận được" của các loại suy luận?

... suy luận kiểu địa phương được phép để hạn chế sự phức tạp của suy ra vọt [các tham số loại]. Mức độ tối thiểu và tối đa của các loại phải được hiểu là liên quan đến tập hợp các loại độ phức tạp chấp nhận được.

Trong thực tế giới hạn là gì?

Ngoài ra, có các giới hạn khác nhau áp dụng cho các loại biểu thức được suy luận hơn so với giới hạn loại thông số và các giới hạn đó không?

+2

[blog này] (http://pchiusano.blogspot.com/2011/05/making-most-of-scalas-extremely-limited.html) có một số thảo luận thú vị về chủ đề này – Jamil

+0

Có, nó đề cập đến một loại loại scala sẽ từ chối suy luận: một hàm tạo kiểu được áp dụng một phần. Tôi tự hỏi nếu có những người khác. – Owen

+20

Tôi khuyên bạn nên đăng lên danh sách gửi thư bằng ngôn ngữ scala được đề cập ở đây: http://www.scala-lang.org/node/199 – david

Trả lời

10

Khi suy ra các loại, trình biên dịch thường cần tính toán Giới hạn dưới cùng (LUB) của một danh sách các loại. Ví dụ: loại if (cond) e1 else e1 là LUB của các loại e1e1.

Những loại có thể nhận được khá lớn, ví dụ thử điều này trong một 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]... 

này commit giới thiệu một số sự tỉnh táo kiểm tra để hạn chế độ sâu của loại suy ra như vậy.

Đã có một số công việc gần đây cho plugin trong quá trình biên dịch để phát hiện loại suy luận mất nhiều thời gian để tính toán và đề xuất những nơi chú thích loại rõ ràng có thể thận trọng.

Các vấn đề liên quan