Параметры типа распространения в методах для Юлии - PullRequest
0 голосов
/ 12 февраля 2019

Джулия (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 в оператор, подобный псевдониму типа?

1 Ответ

0 голосов
/ 12 февраля 2019

Вы можете написать (отредактировано):

rt(r::RT) = r

и теперь

julia> methods(rt)
# 1 method for generic function "rt":
[1] rt(r::Type{R} where R<:Real) in Main at REPL[16]:1

julia> rt(Int)
Int64

и все работает как положено.Похоже, что выражение where в определении метода, если оно присутствует, перезаписывает ограничение в const.Я не уверен, предназначено ли это.

...