【问题标题】:Defining one function for inputs of many types in Julia在 Julia 中为多种类型的输入定义一个函数
【发布时间】:2018-08-07 11:22:57
【问题描述】:

设置:我在 Julia 中有一个函数,它接受两个输入,xy。两个输入都是相同类型的数组,其中该类型可以是任何数字类型、日期、日期时间或字符串。请注意,无论输入数组的上述任何元素类型如何,该函数的内容都是相同的,因此我不想多次编写该函数。目前,我有这样定义的函数:

function MyFunc{T<:Number}(x::Array{T, 1}, y::Array{T, 1})

显然,这会处理数字大小写,但不处理日期、日期时间或字符串。

问题:在 Julia 中编写函数的第一行以适应这些其他类型的最佳实践是什么?请注意,性能很重要。

我的尝试:我可以尝试以下方法:

function MyFunc{T<:Number}(x::Union(Array{T, 1}, Array{Date, 1}, Array{DateTime, 1}, Array{String, 1}) y::Union(Array{T, 1}, Array{Date, 1}, Array{DateTime, 1}, Array{String, 1}))

但这感觉很笨拙(或者可能不是?)。

链接:我想这与我在 Julia 上的另一个 Stack Overflow 问题密切相关,可以在 here 找到。

【问题讨论】:

    标签: types julia


    【解决方案1】:

    答案是使用Union,即

    function MyFunc{T<:Union{Number,Date,DateTime,String}}(x::Array{T, 1}, y::Array{T, 1})
        @show T
    end
    

    ...

    julia> MyFunc([1.0],[2.0])
    T => Float64
    
    julia> MyFunc(["Foo"],["Bar"])
    T => ASCIIString
    

    (使用 Julia 0.6.4 语法...查看 stable documentation 了解当前语法)

    【讨论】:

    • 有趣。我没有意识到子类型运算符可以用于这样的非嵌套类型的联合。谢谢。我想这意味着AnotherFunc{T::Union(Float64, String)}(x::Array{T, 1})AnotherFunc(Union(Array{Float64, 1}, Array{String, 1})) 更受欢迎,这是正确的吗?再次感谢。
    • 我认为这只是可读性的问题,尽管对于这个带有两个参数的特定示例,它们实际上意味着不同的东西。参数版本将要求两个数组具有相同的元素类型,但每个参数都是联合类型的数组将允许 xy 不同
    • 明白。再次感谢。
    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多