Для упрощения я пытаюсь написать функцию с двумя аргументами, где:
Базовый метод принимает два целых числа в качестве аргументов
fun c ( x :: Int, y :: Int) = что-то
Дополнительные методы принимают один или оба аргумента в качестве произвольных типов, отображают эти аргументы в целые числа и вызывают базовый метод
- Дополнительные методы принимают один или оба аргумента в виде массивов (или: типы :: 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 поддерживал множество различных способов индексации структуры когда содержимое структуры может быть несколько разнообразным. Внутренние элементы в структуре индексируются целыми числами, но пользователь может использовать почти произвольные нецелые типы для индексации элементов в структуре (я не хочу заставлять пользователя использовать определенные типы для индексации элементы).