Установка: Рассмотрим параметрического типа в ДжулииВзаимодействия параметрических типов и множественной диспетчеризации в Джулии
type MyType1{T1}
x::T1
end
Я определяю два метода для одной функции над этим типом использованием несколько диспетчерских и типа параметров:
f1(m::MyType1, i::Int64) = m.x + i #Method 1
f1{T1}(m::MyType1, i::T1) = m.x + i + 1 #Method 2
Способ 1 соответствует случаю, когда второй вход Int64
. Метод 2 соответствует случаю, когда второй вход является параметрическим. Я создаю экземпляр MyType1
с использованием m=MyType1{Int64}(1)
и обратите внимание, что m.x
теперь возвращает 1
.
Вопрос 1: Я свидетельствую следующее поведение:
In : f1(m, 1.0)
Out : 3.0
Хорошо, так что я не представила никакой информации о T1
в вызове функции. Кажется, Джулия предположила, что она должна выполнить метод 2 на том основании, что второй вход не был a Int64
. Это то, как вещи действительно работают под капотом?
Вопрос 2: Предположим, что я хочу назвать второй метод, но со вторым вводом как Int64
. Очевидно, что f1(m, 1)
не будет работать, так как это вызовет первый метод. Я попытался это:
In : f1{Int64}(m, 1)
Но Джулия бросает эту ошибку:
ERROR: type: instantiate_type: expected TypeConstructor, got Function
Можно ли получить второй метод для запуска со вторым входом указанного в Int64
, или я глупо?
Вы правы, я пытался реализовать свой метод 2b. Я преобразовываю Matlab, так что все еще изучаю, насколько это касается типов. Нет особых причин для 'Int64'. Я с радостью переключусь на 'Int', если нет удара производительности. Используется ли такое же правило для 'Float' (т. Е. Использовать' Float' вместо 'Float64')? ps Спасибо за ответ + 1 + Tick. Очень ясно, и это именно то, чем я был. –
Нет, для поплавков вам нужно указать 'Float64' или' Float32'. Причина в том, что решение, тип которого используется редко, зависит от типа машины, но требует точности. –