Những giới hạn nào đặt scala đối với "độ phức tạp có thể chấp nhận được" của các kiểu suy luận?


120

Theo Scala Language Spec :

... phép suy luận kiểu cục bộ để giới hạn độ phức tạp của các giới hạn được suy ra [tham số kiểu]. Tính tối thiểu và tối đa của các loại phải được hiểu tương ứng với tập hợp các loại có độ 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 ra chứ không phải cho các giới hạn loại tham số và những giới hạn đó là gì?


2
blog này có một số cuộc thảo luận thú vị về chủ đề này
Jamil

20
Tôi sẽ đề nghị gửi bài vào danh sách gửi thư scala ngôn ngữ đề cập ở đây: scala-lang.org/node/199
Dave L.

1
Tôi không chắc lắm, nhưng tôi nghĩ nó có nghĩa là ví dụ như chúng ta có một danh sách các chuỗi và chúng ta thêm một int vào đó. Danh sách bất biến được trả về cuối cùng thuộc loại "Bất kỳ". Vì vậy, maximality các loại
Jatin

8
Đây thực sự là một mục tiêu di động vì các phiên bản khác nhau của trình biên dịch Scala có các giới hạn khác nhau. Điều này đã thay đổi và tôi hy vọng sẽ tiếp tục thay đổi ít nhất là trong tương lai gần khi ngôn ngữ tiếp tục phát triển. Tôi bỏ phiếu cho câu hỏi này vì nó không thể được trả lời vì nó hiện đang được nêu.
Kevin Sitze 21/12/12

1
@kevin Đúng thật. Tôi cho rằng tôi quan tâm nhất đến scala 2.9, vì nó mới xuất hiện gần đây nhưng ổn định. Nhưng tôi tự hỏi sẽ thay đổi bao nhiêu.
Owen

Câu trả lời:


10

Khi suy ra các kiểu, trình biên dịch thường cần tính Giới hạn Trên Ít nhất (LUB) của danh sách các kiểu. Ví dụ, loại if (cond) e1 else e1là LUB của các loại e1e1.

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

Cam kết này đã giới thiệu một số kiểm tra độ tỉnh táo để giới hạn độ sâu của các kiểu suy luận như vậy.

Gần đây đã có một số công việc bổ sung vào quy trình biên dịch để phát hiện các kiểu suy luận mất nhiều thời gian để tính toán và đề xuất những vị trí mà chú thích kiểu rõ ràng có thể cần thận trọng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.