Можно ли сделать многократную отправку по НЕ-типу? - PullRequest
4 голосов
/ 12 февраля 2020

Для упрощения я пытаюсь написать функцию с двумя аргументами, где:

  1. Базовый метод принимает два целых числа в качестве аргументов

    fun c ( x :: Int, y :: Int) = что-то

  2. Дополнительные методы принимают один или оба аргумента в качестве произвольных типов, отображают эти аргументы в целые числа и вызывают базовый метод

  3. Дополнительные методы принимают один или оба аргумента в виде массивов (или: типы :: Colon) и генерируют массив путем применения соответствующих предыдущих методов (1) или (2) поэлементно.

Неудивительно (задним числом), что этот подход порождает неоднозначности методов. Учитывая типы аргументов, предоставляемых функции, Джулия выбирает допустимый метод с наиболее указанными c типами. Но если x - это массив, а y - это Int, следующие методы одинаково указывают c, и Джулия не знает, какой из них вызывать:

  • fun c (x :: Any , y :: Int)
  • fun c (x :: Array, y :: Any)

Я хотел бы сделать что-то вроде

  • fun c (x :: T, y :: Int) T <: any_so_long_as_not_array = fun c (map_x_to_Int (x), y) </li>
  • fun c (x :: Array, y :: Any) = (el -> fun c (el, y)). (x)

Есть ли такая вещь, как тип не типа? Я думаю об этом неправильно? Есть ли канонический способ решения этой проблемы?

Для контекста я пытаюсь реализовать Base.getindex для структуры, которую я написал, и я хочу, чтобы getindex поддерживал множество различных способов индексации структуры когда содержимое структуры может быть несколько разнообразным. Внутренние элементы в структуре индексируются целыми числами, но пользователь может использовать почти произвольные нецелые типы для индексации элементов в структуре (я не хочу заставлять пользователя использовать определенные типы для индексации элементы).

1 Ответ

4 голосов
/ 13 февраля 2020

Вы можете указать регистр (Array, Int), а затем добавить меньше, указав c методы:

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
...