Julia 中抽象类型数组的使用
Usage of Array of abstract types in Julia
我正在探索 Julia,所以我是新手。现在我正在探索它的强类型特性。我意识到我看不到数组抽象类型的用法。让我用一个例子来解释:
假设我想创建一个接受实数数组的函数,无论其具体类型如何。我会使用:
function f(x::Array{Real})
# do something
end
如果不引发 f has no method matching f(::Array{Float64,1})
,则永远无法调用此函数
我想调用f([1,2,3])
或f([1.,2.,3.])
只要元素的类型是Real。
我读到过您可以提升或转换数组(p.eg f(convert(Array{Real}, [1, 2, 3]))
左右),但我认为这种方式确实非动态且乏味。
除了摆脱强类型行为之外,还有其他选择吗?
谢谢。
要扩展 @user3580870 的解决方案,您还可以使用 typealias
使函数定义更简洁:
typealias RealArray{T<:Real} Array{T}
f(x::RealArray) = "do something with $x"
然后你也可以在匿名函数中使用类型别名:
g = (x::RealArray) -> "something else with $x"
您可以使用 <:
subtype operator:
function f(x::Array)
return zero.(x)
end
function f(x::Array{<:Real})
return one.(x)
end
@show f([1, 2])
@show f([1.0, 2.0])
@show f([1im, 2im])
打印
f([1, 2]) = [1, 1]
f([1.0, 2.0]) = [1.0, 1.0]
f([1im, 2im]) = Complex{Int64}[0+0im, 0+0im]
由于自原始答案以来已经更新,关键字 typealias
已消失,因此 @Matt B. 的解决方案现在为
const RealArray{T<:Real} = Array{T}
f(x::RealArray) = "do something with $x"
为了完整起见,我将其放在此处 ;)
我正在探索 Julia,所以我是新手。现在我正在探索它的强类型特性。我意识到我看不到数组抽象类型的用法。让我用一个例子来解释:
假设我想创建一个接受实数数组的函数,无论其具体类型如何。我会使用:
function f(x::Array{Real})
# do something
end
如果不引发 f has no method matching f(::Array{Float64,1})
我想调用f([1,2,3])
或f([1.,2.,3.])
只要元素的类型是Real。
我读到过您可以提升或转换数组(p.eg f(convert(Array{Real}, [1, 2, 3]))
左右),但我认为这种方式确实非动态且乏味。
除了摆脱强类型行为之外,还有其他选择吗?
谢谢。
要扩展 @user3580870 的解决方案,您还可以使用 typealias
使函数定义更简洁:
typealias RealArray{T<:Real} Array{T}
f(x::RealArray) = "do something with $x"
然后你也可以在匿名函数中使用类型别名:
g = (x::RealArray) -> "something else with $x"
您可以使用 <:
subtype operator:
function f(x::Array)
return zero.(x)
end
function f(x::Array{<:Real})
return one.(x)
end
@show f([1, 2])
@show f([1.0, 2.0])
@show f([1im, 2im])
打印
f([1, 2]) = [1, 1]
f([1.0, 2.0]) = [1.0, 1.0]
f([1im, 2im]) = Complex{Int64}[0+0im, 0+0im]
由于自原始答案以来已经更新,关键字 typealias
已消失,因此 @Matt B. 的解决方案现在为
const RealArray{T<:Real} = Array{T}
f(x::RealArray) = "do something with $x"
为了完整起见,我将其放在此处 ;)