Làm rõ về chữ ký chức năng và hành vi điều phối trong julia


8

Tôi đã thử một số điều trong REPL của Julia (1.2) và tôi đã tập trung suy nghĩ về điều gì đó mà tôi không hiểu về việc gửi đi.


Lần đầu tiên tôi đã thử thứ này đang hoạt động theo cách tôi mong đợi:

f(a::T) where {T <: Int} = "Test"

  • Gọi f (3) hoạt động kể từ khi Int <: Int == true

  • Gọi f ("Hello") dẫn đến lỗi "Phương thứcError: không khớp phương thức" kể từ khi String <: Int == false


Sau đó, tôi đã thử phương pháp này và tôi không hiểu tại sao gọi nó hoạt động trong một số trường hợp:

f(a::T, b::U) where {T, U <: T} = "Another Test"

  • Gọi f (3, 3) hoạt động (như tôi mong đợi)

  • NHƯNG f (3, "Xin chào") cũng hoạt động và không ném "Phương thứcError: không khớp phương thức" ???

Tôi nghĩ rằng (vì T trở thành một Int và U a String) String <: Int == false???


Tôi đoán rằng tôi đang thiếu một cái gì đó khá đơn giản ở đây nhưng tôi không thể tìm thấy nó ... Vì vậy, đây là câu hỏi của tôi, tại sao f (3, "Xin chào") đang hoạt động ???


Hơn nữa, tôi đã thử đoạn mã này (tôi đã cố gắng tạo lại chữ ký phương thức thứ hai) và nó đã thất bại chính xác như tôi mong đợi:

Test = Tuple{T, U} where {T, U <: T}

Test{Int, String} (điều này không thành công như tôi mong đợi với "TypeError: in Type, in U, U <: Int64, got Type {String}")


1
Tôi không thể tái tạo định nghĩa cuối cùng của bạn về f () trở lại Int64,String,false. Bạn có thể cần phải khởi động lại Julia nếu bạn thêm phương thức vào hàm. Chỉ cần sử dụng một nhân vật mới, ví dụ hcho một thử nghiệm mới. Đối với câu hỏi của bạn: Có vẻ như hệ thống cố gắng tìm bất kỳ giải pháp nào cho hạn chế loại và T=Any, U=Any where U:<Tlà một. Nếu bạn giới thiệu một loại cụ thể như trong ví dụ thứ ba của bạn, nó hoạt động như mong đợi. Những người có kiến ​​thức hệ thống âm thanh Julia sẽ sớm đưa ra câu trả lời thích hợp cho vấn đề này.
laborg

Oh! Bạn nói đúng, tôi cần khởi động lại Julia ... Định nghĩa lại của tôi với T <: Int không ghi đè lên cái cuối cùng chỉ có T (không có bất kỳ cảnh báo nào ...). Và câu trả lời của bạn về hệ thống tìm Any như một giải pháp cho T và U giải thích mọi thứ! Cảm ơn bạn :)
SnoopyDoowop

Câu trả lời:


4

Điều đang xảy ra ở đây là Tcó thể là một kiểu dữ liệu và Ucó thể là bất kỳ siêu chuỗi nào. Điều này được đáp ứng. Thứ khiến bạn vấp ngã với chuỗi không phải là một kiểu con của int là một cá trích đỏ vì không có loại cụ thể nào là kiểu con của bất kỳ loại nào khác.


Và tại sao với định nghĩa Tuple thay vì nó tăng lỗi?
Antonello

3

Ok, nhờ laborg , dường như bây giờ tôi đã hiểu chuyện gì đang xảy ra. Nếu chúng ta thực hiện phương pháp này:

f(a::T, b::U) where {T, U <: T} = "Another Test"

  • 'T' là "Union ALL" hay còn gọi là "Liên minh lặp" của tất cả các loại 'a' có thể.
  • 'U' là "Union ALL" hay còn gọi là "Liên minh lặp" của tất cả các loại 'b' có thể là các kiểu con của 'T'

  • Điều tôi đã hiểu lầm là nếu (ví dụ) a :: Int, thì T có thể lấy một kiểu trừu tượng cha mẹ của kiểu chữ (a). Vì Int <: Any, nên T = Any là một giải pháp hợp lệ cho công văn.

  • Tương tự cho U = Any kể từ Chuỗi <: Any.

Vì vậy, bây giờ chúng ta có U <: T giải quyết thành Bất kỳ <: Any == true và phương thức được gọi!

Tôi hy vọng tôi có được nó :)


Bạn làm. Tại thời điểm này, của bạn là một câu trả lời tốt hơn so với của tôi.
Oscar Smith
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.