在指定类型时调用具有参数类型的函数 (Julia 0.5)

Call a Function with parametric type while specifying the Type (Julia 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 那么,是否可以在函数调用期间使用 {} 语法 调用任何函数(参数类型的构造函数除外)

编辑:我提出这个问题的原因是因为我想使用默认参数但同时指定类型,比如 f{BigFloat}().

乔治,

当您调用参数化函数时,参数 "picks up" 的值由您在函数调用中放置的参数值 [s] 的类型 [s] 确定。信息流是从给定的参数到符号类型参数。所以你不应该尝试调用 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

如果您想完成其他事情,请告诉我具体情况。

如果您不介意将 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)