在指定类型时调用具有参数类型的函数 (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)
。
(我指的是 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)
。