Julia 参数化返回类型
我试图理解参数化类型在Julia中是如何工作的 假设我有一个函数Julia 参数化返回类型,julia,Julia,我试图理解参数化类型在Julia中是如何工作的 假设我有一个函数foo,它接受一个整数(即非参数类型),我想断言这个函数以返回一个向量,它的元素是实的子类型。根据文件,我推断应按以下方式实施: function foo{T<:Real}(n::Integer) # come code to generate variable vec return vec::Vector{T} end function foo{T参数化类型用于参数化函数的输入,而不是输出。如果函数是
foo
,它接受一个整数
(即非参数类型),我想断言这个函数以返回一个向量,它的元素是实
的子类型。根据文件,我推断应按以下方式实施:
function foo{T<:Real}(n::Integer)
# come code to generate variable vec
return vec::Vector{T}
end
function foo{T参数化类型用于参数化函数的输入,而不是输出。如果函数是类型稳定的(请阅读中的说明),则编译器可以根据输入类型自动推断函数的输出,因此无需指定它
因此,您的函数可能如下所示:
function foo{T<:Real}(n::T)
#some code to generate vec
return(vec)
end
function f1{T<:Number}(x::T)
y = Array(T, 0)
#some code to fill out y
return(y)
end
但是这样做,并且类型稳定,因为如果输入类型是已知的,那么输出也是已知的
f{T<:Number}(x::Vector{T}) = x
f{TA参数化方法或参数化类型的构造函数
使用传统的括号语法调用函数:
上述规则适用于参数方法和非参数方法。
因此,不应该尝试调用参数化方法,如:f{atype}(2,3)
。我认为这种用法的来源可能是调用参数化类型构造函数的语法:
但对于参数化方法:
julia> same_type{T}(x::T, y::T) = true;
julia> typeof(same_type)
Function
julia> same_type{Int}
ERROR: TypeError: Type{...} expression: expected Type{T}, got Function
因此,通过这一介绍,我们可以清楚地看到:
function foo{T<:Real}(n::Integer)
.....
end
参数化方法的主要目的是让dispatch在调用函数时针对参数类型找到正确的调用方法,但它也有以下惯用的副作用:
方法类型参数不限于用作类型
参数的定义:它们可以在数据库中的任何值处使用
函数或函数体的签名
现在,让我们回到主要问题:
如何编写带有参数化返回类型的方法?
如果您的方法已经是参数化的,您可以使用参数值作为返回类型,如上面的mytypeof
sample中所示,或者例如:
julia> newoftype{T}(x::T,n) = T(n)
newoftype (generic function with 1 methods)
julia> newoftype([1,2],4)
4-element Array{Int32,1}:
57943296
72475184
141142104
1970365810
但是作为方法的返回类型,参数值函数是一个简单的功能,可以简单地完成,而不需要参数化方法。实际上,许多典型的方法都可以完成这项工作,例如:
julia> Array(Int,4)
4-element Array{Int32,1}:
126515600
72368848
72474944
0
julia> Array(Float64,4)
4-element Array{Float64,1}:
-2.122e-314
0.0
5.12099e-292
5.81876e-292
可以使用类型的参数类型来完成,例如:
julia> myarray(T::Type,n::Int)=Array(T,n);
julia> same_type{T}(x::T, y::T) = true;
julia> same_type(x,y) = false;
julia> same_type(1, 2)
true
julia> same_type(1, 2.0)
false
julia> mytypeof{T}(x::T) = T
mytypeof (generic function with 1 method)
julia> mytypeof(1)
Int64
julia> newoftype{T}(x::T,n) = T(n)
newoftype (generic function with 1 methods)
julia> newoftype([1,2],4)
4-element Array{Int32,1}:
57943296
72475184
141142104
1970365810
julia> Array(Int,4)
4-element Array{Int32,1}:
126515600
72368848
72474944
0
julia> Array(Float64,4)
4-element Array{Float64,1}:
-2.122e-314
0.0
5.12099e-292
5.81876e-292
julia> myarray(T::Type,n::Int)=Array(T,n);