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参数化类型用于参数化函数的输入,而不是输出。如果函数是

我试图理解参数化类型在Julia中是如何工作的

假设我有一个函数
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);