Я хочу получить тип результата вызова функции в Julia без оценки функции и использовать этот тип. Желаемое использование выглядит примерно так:
foo(x::Int32) = x
foo(x::Float32) = x
y = 0.0f0
# Assert that y has the type of result of foo(Float32)
y::@resultof foo(Float32) # This apparently does not work in Julia
Хотя в приведенном выше случае я могу просто использовать y::typeof(foo(1.0f0))
с оценкой фиктивной переменной, в более сложных случаях инициализация фиктивной переменной может быть неудобной идорого. Например, я хочу использовать тип итератора, возвращаемый функцией eachline(filename::AbstractString; keep::Bool=false)
, но использование typeof
действительно требует успешного открытия файла, что выглядит как перебор.
Из фона C ++, что яСпрашивается, есть ли в Джулии эквивалент std::result_of
? Вопрос почти такой же, как этот , но язык - Юлия.
После некоторых исследований я вижу, что Юлия позволяет возвращать значения различных типов в одной функции, гдевывод типа выглядит очень сложно. Например,
foo(x::Int64) = x == 1 ? 1 : 1.0
Тип возвращаемого значения теперь может быть Int64
или Float64
, в зависимости от входного значения. Тем не менее, в этом случае мне все еще интересно, есть ли какие-нибудь макро-трюки, которые могут сделать вывод, что тип возвращаемого значения равен Union{ Int64, Float64 }
?
Подводя итог, я могу задать следующие вопросы:
- По сути, возможно ли получить возвращаемый тип функции, только указав типы аргументов в Julia?
- Если 1 невозможно, для функций, имеющих один детерминированный тип возвращаемого значения (как в первом примере), возможно ли получить возвращаемый тип без оценки?
- (Возможно, это не связано с тем, что я хочу, но я думаю, что это может улучшить мое понимание) Когда компилируются коды Джулии, известны ли типы возвращаемых функций? Или информация о типе определяется только во время выполнения?