2011-12-06 41 views
10

Các đặc điểm Map[A,+B] có một phương phápLoại tham số của minBy [B] (f: ((A, B)) ⇒ B) (CMP ngầm: Thứ tự [B]): (A, B)

def minBy [B] (f: ((A, B)) ⇒ B)(implicit cmp: Ordering[B]): (A, B) 

tôi mong đợi các B của đặc điểm để được giống như một trong phương pháp này, nhưng sau đó tôi không thể vẫn có ý nghĩa của việc này:

val m2 = Map('a -> "1", 'b ->"2" ,'c ->"3") 
m2.minBy((t:(Symbol,String))=>Integer.parseInt(t._2)) 

ở đây, B của Map[A,+B]String, nhưng B của minByInt - hoặc err I?

Vì vậy, tôi mong đợi các loại của phương pháp này là khá

def minBy [C] (f: ((A, B)) ⇒ C)(implicit cmp: Ordering[C]): (A, B) 

Nhưng thats không phải những gì các nguồn tin cho biết.

Nếu cả hai đều khác nhau, tôi nên biết ở đâu? Nếu họ không - bạn có thể phát hiện, và chỉ ra, sai lầm của tôi?

Trả lời

6

Phân tích của bạn là chính xác, nó sẽ được đổi tên thành C, hoặc cái gì khác. Vấn đề là scaladoc chỉ đơn giản là thay thế A trong định nghĩa trong TraversableLike bằng một Tuple (A, B) bởi vì nó là một bản đồ. Đây là định nghĩa từ TraversableLike:

def minBy [B] (f: (A) ⇒ B)(implicit cmp: Ordering[B]): A 

vì bản đồ, scaladoc thay thế (A) bằng một bộ (A, B).

def minBy [B] (f: (A, B) ⇒ B)(implicit cmp: Ordering[B]): (A, B) 

mà bạn quan sát, không thực sự là chữ ký chính xác.

Đây là vấn đề đã biết, scaladoc does not disambiguate between same-named type parameters. Bình chọn nó lên hoặc gửi một bản vá!

+0

Ah, được rồi, tôi đã sai về nhận xét nguồn đó. Phương thức minBy được khai báo trong GenTraversableOnce, sau đó được định nghĩa trong TraversableOnce - và cả hai đều không biết về B. Vì vậy, nó thực sự là một vấn đề scaladoc. Cảm ơn cả hai người. – Theodosius

7

Có vẻ như phần mềm xây dựng tài liệu đã không đổi tên biến số B từ định nghĩa của đặc điểm minBy, do đó gây ra xung đột tên. Phân tích của bạn có vẻ đúng.

Để sử dụng thuật ngữ từ phép tính lambda, tôi muốn nói rằng phần mềm không thành công alpha-convert.

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