Julia中抽象类型数组的用法

时间:2016-03-01 08:26:36

标签: arrays julia strong-typing

我正在探索朱莉娅,所以我是新手。现在我正在探索其强类型功能。我意识到的是我无法看到数组的抽象类型的用法。让我用一个例子来解释:

让我们假设我想创建一个接受实数数组的函数,无论其具体类型如何。我会用:

function f(x::Array{Real})
  # do something
end

如果不提出f has no method matching f(::Array{Float64,1})

,就不能调用此函数

只要元素的类型为Real,我想调用f([1,2,3])f([1.,2.,3.])

我已经读过你可以提升或转换数组(p.eg f(convert(Array{Real}, [1, 2, 3]))左右),但我认为这种方式非常动态且乏味。

还有其他选择而不是摆脱强类型行为吗?

感谢。

3 个答案:

答案 0 :(得分:7)

要通过@user3580870扩展解决方案,您还可以使用typealias使函数定义更简洁:

typealias RealArray{T<:Real} Array{T}
f(x::RealArray) = "do something with $x"

然后你也可以在匿名函数中使用typealias:

g = (x::RealArray) -> "something else with $x"

答案 1 :(得分:1)

自从原始答案以来已有更新,关键字typealias消失了,因此@Matt B.的解决方案将变为

const RealArray{T<:Real} = Array{T}
f(x::RealArray) = "do something with $x"

为了完整起见,我将其放在这里;)

答案 2 :(得分:0)

您可以使用<: 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]