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

时间:2016-12-08 01:51:45

标签: function types julia function-call

(我指的是朱莉娅0.5) 让我们说我定义一个函数:

class LocaleRepository extends EntityRepository { public function myCustomFunction() { .... } } 我想在指定类型时调用它,但不通过参数指定它。例如。我想要做: f{T<:Real}(x::T=one(T), y::T=one(T)) = x+y 在控制台中,这会给出错误: f{Float64}() 那么,是否可以在函数调用期间使用 ERROR: TypeError: Type{...} expression: expected Type{T}, got #f 语法调用任何函数(除参数类型的构造函数外)?

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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:2)

乔治,

当您调用参数化函数时,参数“拾取”的值由您放置在函数调用中的参数值[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

如果你想要完成别的事情,请告诉我具体细节。