是否可以对 NOT-a-type 进行多次调度?

use*_*868 5 multiple-dispatch julia

为了简化,我尝试编写一个带有两个参数的函数,其中:

  1. 基本方法接受两个整数作为参数

    func(x::Int, y::Int) = 某事

  2. 其他方法接受一个或两个参数作为任意类型,将这些参数映射到整数,然后调用基本方法

  3. 其他方法接受一个或两个参数作为数组(或 ::Colon 类型),并通过按元素应用适当的先前方法 (1) 或 (2) 来生成数组。

毫不奇怪(事后看来),这种方法会产生方法模糊性。鉴于提供给函数的参数类型,Julia 选择具有最具体类型的有效方法。但如果 x 是一个数组并且 y 是一个 Int,则以下方法同样具体,而 Julia 不知道该调用哪一个:

  • func(x::任意,y::整数)
  • func(x::数组,y::任意)

我想做类似的事情

  • func(x::T, y::Int) T <: any_so_long_as_not_array = func(map_x_to_Int(x), y)
  • func(x::Array, y::Any) = (el -> func(el, y)).(x)

是否存在诸如“非类型”之类的东西?我是否以错误的方式思考这个问题?是否有解决此类问题的规范方法?

对于上下文,我试图为我编写的结构实现 Base.getindex,并且当结构的内容可能有所不同时,我希望 getindex 支持许多不同的方法来索引结构。在幕后,结构中的元素由整数索引,但用户可能使用几乎任意的非整数类型来索引结构中的元素(我不想强迫用户使用特定类型来索引元素)。

Bil*_*ill 4

您可以指定 (Array, Int) 情况,然后添加不太具体的方法:

julia> func(x::Array, i::Int) = 0
func (generic function with 1 method)

julia> func(x, i::Int) = 1
func (generic function with 2 methods)

julia> func(x::Array, i) = 2
func (generic function with 3 methods)

julia> methods(func)
# 3 methods for generic function "func":
[1] func(x::Array, i::Int64) in Main at REPL[1]:1
[2] func(x, i::Int64) in Main at REPL[2]:1
[3] func(x::Array, i) in Main at REPL[3]:1
Run Code Online (Sandbox Code Playgroud)