Джулия (v1.0
) не распространяет параметры свободного типа вне определения метода при использовании псевдонима типа:
const RT{R<:Real} = Type{R}
rt(::RT{R}) where R = R
rt2(::Type{R}) where {R<:Real} = R
# there's more logic here for other subtypes
Это прекрасно работает для R<:Real
:
julia> rt(Int), rt2(Int) # works for both
(Int64, Int64)
Но rt()
свободно принимает входные данные не <:Real
julia> rt(Char)
Char
julia> rt2(Char)
MethodError: no method matching rt2(::Type{Char})
Кажется, что rt2
отслеживает верхнюю границу <:Real
, а rt
-
julia> methods(rt)
# 1 method for generic function "rt":
[1] rt(::Type{R}) where R in Main at REPL[2]:1
julia> methods(rt2)
# 1 method for generic function "rt2":
[1] rt2(::Type{R}) where R<:Real in Main at REPL[3]:1
Есть ли в любом случае автоматическое включение ограничения R<:Real
в оператор, подобный псевдониму типа?