Юлия: Шаблонные функции для приема нескольких типов массивов - PullRequest
0 голосов
/ 24 августа 2018

Я пытаюсь поддерживать возможность повторного использования кода, используя тип Array, но не знаю, как действовать, не пропуская «недопустимые» типы. Пример функциональности:

foo = function(x::Array{Number,2})
    print(x)
end

foo([1 2 3; 4 5 6; 7 8 9])
# 15

foo([1 2 3])
# MethodError: no method matching (::Array{Int64,1})
# Closest candidate is (::Array{Number,2})

foo(["alpha" "beta"; "pi" "rho"])
# MethodError: no method matching (::Array{String,2})
# Closest candidate is (::Array{Number,2})

Однако в первом примере foo([1 2 3; 4 5 6; 7 8 9]) возвращается с MethodError: no method matching (::Array{Int64,2}), хотя теоретически (::Array{Number,2}) является действительной рекламой. Я не хочу вручную конвертировать для каждого вызова функции; и при этом я не хочу объявлять все массивы типа Array{Number,2}. Я знаю, что вместо этого я мог бы заменить вызов функции на:

foo = function(x::Array)
    print(x)
end

Однако это позволяет использовать массивы любой размерности и типа в функции. Единственная альтернатива, о которой я могу подумать, - это добавить шаблонный код, где я изначально разрешаю вводить все массивы, проверять их типизацию и размер вручную и переходить оттуда, но это выглядит не элегантно.

Есть предложения? Заранее спасибо. (Примечание: я использую Julia 0.6.3)

1 Ответ

0 голосов
/ 24 августа 2018

Используйте Matrix{<:Number} вместо Array{Number, 2} в качестве ограничения типа, и все будет работать (также будет работать Array{<:Number, 2}).

Вкратце Matrix{Int64} не является подтипом Matrix{Number}, но являетсяподтип Matrix{T} where {T<:Number}, который можно выразить как Matrix{<:Number}, если вы не используете T в теле функции.

Руководство Джулии здесь https://docs.julialang.org/en/v0.6.4/manual/types/#Parametric-Abstract-Types-1 и здесь https://docs.julialang.org/en/v0.6.4/manual/methods/#Parametric-Methods-1 подробно описывает, как работает подтип в параметрических типах в Julia 0.6.Тогда я думаю, что вы можете проверить этот недавний вопрос SO Джулия: создание метода для любого вектора с отсутствующими значениями , чтобы понять, как можно обрабатывать более сложные случаи подтипирования.

...