Trong mãTại sao chú thích phương sai gây ra mối quan hệ phụ này không được suy ra bởi Scala?
sealed trait Node[+T]
case class I[C]() extends Node[C => C]
def test[A, B](n: Node[A => B]) = n match {
case i: I[c] =>
val cId: c => c = identity _
val ab: A => B = cId
}
Scala cung cấp cho các lỗi mà c => c
không phải là A => B
. Xóa chú thích phương sai trong Node[+T]
sẽ giải quyết được lỗi.
Tôi bối rối vì tôi tin rằng, với sự hiện diện của chú thích phương sai, kết quả phù hợp i: I[c]
nên tạo quy tắc (c => c) <:< (A => B)
, đó là tất cả những gì cần thiết cho dòng đó để biên dịch. Tôi đang thiếu gì?
Tham số chức năng là CONTRAvariant trên đối số của chúng. Nó không phải là một câu trả lời, nhưng là một sự đoán. –
@MikeG. Hm Tôi tự hỏi liệu điều đó có liên quan hay không nhưng tôi không thể thấy được cách nào - sự khác biệt của '=> 'dường như không được chơi ở đây. Tất nhiên, nếu tôi đúng về điều đó, tôi sẽ có thể tái tạo ví dụ này mà không có các loại hàm và nó vẫn không thành công. Có lẽ tôi sẽ thử điều đó. – Owen
Sau một số thử nghiệm tiếp theo, điều này dường như không liên quan đến phương sai '=>' ...hoặc thậm chí là '=>' cụ thể, nhưng dường như có liên quan đến biến kiểu lặp lại trong 'c => c'. Vẫn không chắc tại sao lại quan trọng. – Owen