2014-05-04 12 views
7

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ì?

+1

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. –

+0

@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

+0

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

Trả lời

0

Tuyên bố từ chối trách nhiệm: c khi thời gian chạy bị xóa và kết quả trùng khớp của bạn sẽ không hoạt động chính xác. Bạn đang so khớp trên I[_]

Trong trường hợp Node của bạn là bất biến Node[A] là một lớp con của Node[B] chỉ iff A=B. Điều này buộc

n truyền cho test[A, B](n: Node[A => B]) để được thực sự Node[A => B]

Nếu bạn lý do xuống, nếu bạn n khớp với mẫu I[Something] cho bất cứ điều gì Something, A và B phải loại Something

Trong trường hợp Node là covariant, vì định nghĩa của Function1[-A,+B] bạn có thể gọi đến

test[A,B](n) nơi nNode[A1 =>B1] nơi A1>:AB1<:B(phương trình 1)

vì vậy nếu n của bạn phù hợp với một I[C] nó có nghĩa là A1 = CB1 = C

Nếu bạn thay thế C trong phương trình 1, bạn sẽ nhận được C >: AC<:B(phương trình 2)

Do đó nhiệm vụ sau đây không hợp lệ nữa

f: A => B = C => C 

Đối với phía bên tay trái để có thể chuyển nhượng từ phía bên tay phải, chúng ta cần C => CFunction1[-A,+B]

Điều này có nghĩa rằng A >: CB <: C nhưng từ phương trình 2 chúng ta đều biết rằng điều này không giữ (ngoại trừ trường hợp C = A và C = B, và không có bằng chứng nào cho trường hợp này, trừ khi Nút của bạn là bất biến)

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