Tôi muốn sử dụng một kiểu con của tham số hàm trong định nghĩa hàm của mình. Điều này có thể không? Ví dụ, tôi muốn viết một cái gì đó như:Tôi có thể sử dụng một kiểu con của tham số hàm trong định nghĩa hàm không?
g{T1, T2<:T1}(x::T1, y::T2) = x + y
Vì vậy mà g
sẽ được xác định đối với bất kỳ x::T1
và bất kỳ y
đó là một subtype của T1
. Rõ ràng, nếu tôi biết, ví dụ, rằng T1
sẽ luôn luôn là Number
, sau đó tôi có thể viết g{T<:Number}(x::Number, y::T) = x + y
và điều này sẽ làm việc tốt. Nhưng câu hỏi này là dành cho trường hợp T1
không được biết đến cho đến khi chạy.
Đọc nếu bạn đang tự hỏi tại sao tôi muốn làm điều này:
Một mô tả đầy đủ về những gì tôi đang cố gắng để làm sẽ là một chút rườm rà, nhưng những gì sau là một ví dụ đơn giản.
Tôi có một loại parameterised, và một phương pháp đơn giản định nghĩa trên kiểu đó:
type MyVectorType{T}
x::Vector{T}
end
f1!{T}(m::MyVectorType{T}, xNew::T) = (m.x[1] = xNew)
Tôi cũng có một kiểu khác, với một bản tóm tắt siêu kiểu định nghĩa như sau
abstract MyAbstract
type MyType <: MyAbstract ; end
tôi tạo một thể hiện của MyVectorType
với loại phần tử vectơ được đặt thành MyAbstract
sử dụng:
m1 = MyVectorType(Array(MyAbstract, 1))
Tôi muốn đặt một phiên bản MyType
vào MyVectorType
. Tôi có thể làm điều này, kể từ MyType <: MyAbstract
. Tuy nhiên, tôi không thể làm điều này với f1!
, vì định nghĩa hàm nghĩa là xNew
phải thuộc loại T
và T
sẽ là MyAbstract
, không phải MyType
.
Hai giải pháp tôi có thể nghĩ ra cho vấn đề này là:
f2!(m::MyVectorType, xNew) = (m.x[1] = xNew)
f3!{T1, T2}(m::MyVectorType{T1}, xNew::T2) = T2 <: T1 ? (m.x[1] = xNew) : error("Oh dear!")
Đầu tiên về bản chất là một giải pháp vịt-gõ. Thứ hai thực hiện kiểm tra lỗi thích hợp trong bước đầu tiên.
Được ưu tiên hơn? Hoặc là có một giải pháp thứ ba, tốt hơn tôi không biết?
Câu trả lời rất hữu ích - Tôi đã học được rất nhiều. Cảm ơn nhiều. –