2016-12-08 2 views
1

(я имею в виду Джулии 0.5) Допустим, я определяю функцию:Вызов функции с параметрическим типа при задании типа (Julia 0.5)

f{T<:Real}(x::T=one(T), y::T=one(T)) = x+y И я хочу назвать его при указании типа, но без указания его с помощью аргументов. Например. Я хочу сделать: f{Float64}() В консоли это дает ошибку: ERROR: TypeError: Type{...} expression: expected Type{T}, got #f Итак, можно назвать любую функцию (помимо конструкторов для параметрических типов), используя {} синтаксис во время вызова функции?

EDIT: Причина, по которой я столкнулся с этим вопросом, состоит в том, что я хотел использовать аргументы по умолчанию, но также указать тип в то же время, что-то вроде f{BigFloat}().

ответ

4

Если вы не возражаете писать f(BigFloat) вместо f{BigFloat}(), вы можете изменить определение функции для:

f{T}(args::T...) = f(T, args...) 
f{T<:Real}(::Type{T}, x::T=one(T), y::T=one(T)) = x+y 

, который позволяет указать тип, если необходимо в то же время позволяя вам писать f(1,2).

2

Джордж,

При вызове параметризованные функции, значение, что параметр «подхватывает» определяется типом [с] значения аргумента [ы] вы размещаете в вызове функции. Информационный поток от данных аргументов до символьного типа. Поэтому вы не должны пытаться позвонить f{AbstractFloat}(some_kind_of_number). В этом случае some_kind_of_number может быть, например, Float64, и это соответствует; но это может быть, например, Int64, а затем у вас есть конфликт.

Если вы хотите, чтобы числовая переменная принимала определенный числовой тип, правильный подход заключается в том, чтобы преобразовать его напрямую или определить преобразование для этого случая (если оно еще не существует). Если вы хотите, чтобы поймать что-то несоответствие, то правильный подход должен пройти в типе вы хотите указать вместе с числовой переменной:

# below 
# x is of type Real or of any subtype of Real 
# T is Real or any type that is a subtype of Real 
# so T may or may not equal typeof(x) 

function f{T<:Real}(::Type{T}, x::Real) 
    y = convert(T, x) 
    return g(y) 
end 

function f{T<:Real}(::Type{T}, x::Real) 
    if typeof(x) == T 
     #... 
    else 
     throw(ErrorException("msg")) 
    end 
end 

Позвольте мне знать, с особенностями, если вы пытаетесь достичь что-то другое.

+0

Спасибо за ответ, но я хорошо осведомлен о функции «convert» и стабильности типа в целом, и ваш ответ не то, что я искал. Я искал способ передать информацию типа в функцию без каких-либо фактических аргументов, помимо информации о типе. Второй ответ на мой вопрос Фабио был именно тем, что я хотел. –

Смежные вопросы