2011-02-03 29 views
38

Trong khi cố gắng tìm một giải pháp cho một câu hỏi khác ([1]) Tôi đã gặp một lỗi mở rộng tiềm ẩn phân tán. Tôi đang tìm kiếm một lời giải thích về điều này có nghĩaLỗi mở rộng tiềm ẩn phân tách là gì?

Dưới đây là các trường hợp sử dụng:

scala> implicit def ordering[T](implicit conv: T => Ordered[T], res: Ordering[Ordered[T]]) = Ordering.by(conv) 
ordering: [T](implicit conv: (T) => Ordered[T],implicit res: Ordering[Ordered[T]])scala.math.Ordering[T] 

scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted 
<console>:6: error: diverging implicit expansion for type Ordering[T] 
starting with method ordering in object $iw 
     def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted 
               ^

Trả lời

19

Nếu bạn chạy này trong scala với lập luận -Xlog-implicits trôi qua, bạn sẽ có được thêm thông tin:

scala.this.Prefed.conforms không phải là một giá trị tiềm ẩn giá trị (T) => Ordered [T] vì:

loại không phù hợp:

tìm thấy: <: < [T, T]

yêu cầu: (T) => Ordered [T]

scala.this.predef.conforms không phải là một giá trị tiềm ẩn giá trị (Ordered [T]) => Ordered [Ordered [T]] vì:

loại không phù hợp:

tìm thấy: <: < [Ordered [T], Ordered [T]]

yêu cầu: (Ordered [T]) => Đã đặt hàng [Đã đặt hàng [T]]

math.this.Ordering.ordered không phải là một giá trị tiềm ẩn giá trị đặt hàng [T] vì:

đối số loại [T] không phù hợp với phương pháp đặt hàng của giới hạn kiểu tham số [A <: scala.math. Đã đặt hàng [A]]

Đây chủ yếu là suy đoán, nhưng dường như có ý nghĩa gì đó. Tôi sẽ cố gắng điều tra thêm:

Điều này dường như gợi ý rằng có ba gián đoạn đang được xem xét ở đây. Cuối cùng, chữ ký của sorted yêu cầu nó để tìm một cái gì đó của loại Ordering[T]. Vì vậy, nó đang cố gắng xây dựng hàm ẩn của bạn ordering. Thứ nhất, nó đang cố gắng điền vào conv bằng cách tìm một ẩn của loại (T) => Ordered[T], nơi mà nó tìm kiếm trong Predef - mà có vẻ như sủa lên cây sai. Sau đó, nó cố gắng tìm một ẩn cho (Ordered[T]) => Ordered[Ordered[T]] ở cùng một vị trí, vì by có tham số ẩn của loại Ordering[S], trong đó SOrdered[T] theo số conv. Vì vậy, nó không thể xây dựng ordering.

Sau đó, nó cố gắng sử dụng ordering trong math.Ordering, nhưng điều này cũng không phù hợp. Tuy nhiên, tôi nghĩ rằng đây là những gì mang lại cho thông điệp 'lừa đảo phức tạp' hơi khó hiểu. Vấn đề không phải là họ đang phân kỳ, đó là không có một trong những phù hợp trong phạm vi, nhưng nó đang bị nhầm lẫn bởi thực tế là có hai con đường để đi xuống. Nếu một cố gắng xác định def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted mà không có hàm được sắp xếp ngầm định, thì nó không thành công chỉ với một thông điệp tốt đẹp nói rằng nó không thể tìm thấy một hàm ẩn thích hợp.

+1

Tôi không biết, tôi nghĩ nó có nghĩa là có đệ quy. "Hai con đường để đi xuống" sẽ là "implicit" IIUC. – nafg

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