Julia 为具有多种可能类型的参数定义函数

Julia 为具有多种可能类型的参数定义函数,julia,Julia,使用可以有多种类型的参数定义函数的最佳方法是什么? e、 g.Float64或Array{Float64}/Array{Float64,2}或SparseMatrixCSC{Float64} 假设我定义了以下函数: function meanValue(a::Array{Float64}) return mean(a) end 如何在不复制粘贴原始函数内容的情况下为标量值或稀疏向量定义函数? 谢谢大家! 在这种情况下,您可以使用联合,例如 julia> f(x::Union{Floa

使用可以有多种类型的参数定义函数的最佳方法是什么? e、 g.
Float64
Array{Float64}
/
Array{Float64,2}
SparseMatrixCSC{Float64}

假设我定义了以下函数:

function meanValue(a::Array{Float64})
  return mean(a)
end
如何在不复制粘贴原始函数内容的情况下为标量值或稀疏向量定义函数?
谢谢大家!

在这种情况下,您可以使用
联合
,例如

julia> f(x::Union{Float64, Int}) = typeof(x)
f (generic function with 1 method)

julia> f(1)
Int64

julia> f(1.0)
Float64

julia> f(true)
ERROR: MethodError: no method matching f(::Bool)
Closest candidates are:
  f(::Union{Float64, Int64}) at REPL[1]:1
这种方法的一个很好的例子是
Base.Chars

julia> Base.Chars
Union{AbstractArray{Char,1}, Char, Set{Char}, Tuple{Vararg{Char,N} where N}}
例如在
strip
功能中使用

但是,在许多情况下,不指定可接受的类型是可以的,例如:

f(x) = typeof(x)
这不会对性能造成任何损失,并且有一个好处,即如果将来您希望在最初没有想到的类型上使用函数,则不必重新定义它(甚至可能在定义函数时没有定义该类型)

当然,在某些情况下,您需要指定接受的类型-然后您可以:

  • 使用
    联合
  • 单独处理案例和/或使用所需类型的超类型的抽象类型(参见@DNF的答案)

  • 在这种情况下,您可以使用
    Union
    ,例如:

    julia> f(x::Union{Float64, Int}) = typeof(x)
    f (generic function with 1 method)
    
    julia> f(1)
    Int64
    
    julia> f(1.0)
    Float64
    
    julia> f(true)
    ERROR: MethodError: no method matching f(::Bool)
    Closest candidates are:
      f(::Union{Float64, Int64}) at REPL[1]:1
    
    这种方法的一个很好的例子是
    Base.Chars

    julia> Base.Chars
    Union{AbstractArray{Char,1}, Char, Set{Char}, Tuple{Vararg{Char,N} where N}}
    
    例如在
    strip
    功能中使用

    但是,在许多情况下,不指定可接受的类型是可以的,例如:

    f(x) = typeof(x)
    
    这不会对性能造成任何损失,并且有一个好处,即如果将来您希望在最初没有想到的类型上使用函数,则不必重新定义它(甚至可能在定义函数时没有定义该类型)

    当然,在某些情况下,您需要指定接受的类型-然后您可以:

  • 使用
    联合
  • 单独处理案例和/或使用所需类型的超类型的抽象类型(参见@DNF的答案)

  • 不必在函数签名中列出很多类型,您可以尝试使用通用的方法。你想要各种数组和各种数字的平均值吗?那么,也许试试看

    function meanvalue(a::AbstractArray{<:Number})
        return mean(a)
    end
    

    现在,您已经讨论了大多数可能性,至少是关于数组的可能性。

    不要在函数签名中列出许多类型,您可以尝试使用一般性的方法。你想要各种数组和各种数字的平均值吗?那么,也许试试看

    function meanvalue(a::AbstractArray{<:Number})
        return mean(a)
    end
    

    现在,您已经讨论了大多数可能性,至少涉及数组。

    可能值得明确提及
    Union{AbstractArray{Float64},Float64}
    ,即涵盖OP提到的类型的Union。可能值得明确提及
    Union{AbstractArray{Float64},Float64}
    ,也就是说,包含OP.Julia提到的类型的union自动专门处理给定的类型,因此没有类型参数的
    meanValue(a)
    不会有性能损失。它们使用起来非常好,但请注意,这是为了安全,而不是为了速度。在许多情况下,不添加参数(称为duck类型)是首选。看,这澄清了很多。我假设指定类型将提高速度!Julia自动专门处理给定的类型,因此没有类型参数的
    meanValue(a)
    将不会受到性能损失。它们使用起来非常好,但请注意,这是为了安全,而不是为了速度。在许多情况下,不添加参数(称为duck类型)是首选。看,这澄清了很多。我假设指定类型将提高速度!