Функция не соответствует параметрам в миграции языковой версии и как узнать сигнатуру функции - PullRequest
0 голосов
/ 01 сентября 2018

Я перенесу какой-то код, который у меня есть, из старой версии Julia в Julia 1.0.0. Хотя я уже адаптировал базовый (тип -> изменяемая структура, неизменяемый -> структура), я получаю сообщение об ошибке

ERROR: LoadError: MethodError: no method matching ... 

Несоответствующая функция находится в функции, возвращаемой функцией (то есть я использую функтор, который изменяет поведение функции, которую она возвращает, изменяя параметры внутренней функции путем замыкания). Проблема в возвращенной функции (в случае, если это влияет на проблему, я не знаю).

Вопросы:

  1. Это часто встречается при переносе кода? Что происходит?
  2. Есть ли способ напечатать сигнатуру функции для устранения проблемы? (Я попытался tipeof(f), но не вернул необходимую информацию).
  3. Знаете ли вы практичный способ отладки этих сигнатур, не соответствующих проблемам?

Заранее спасибо.

1 Ответ

0 голосов
/ 01 сентября 2018

Объявление 1. Это может произойти, когда тип того, что вы передаете функции, изменился, а сигнатура функции носит ограничительный характер. Например, в Julia 0.6 у вас есть следующий тип возврата transpose:

julia> transpose([1,2,3])
1×3 RowVector{Int64,Array{Int64,1}}:
 1  2  3

а у Юлии 1,0

julia> transpose([1,2,3])
1×3 LinearAlgebra.Transpose{Int64,Array{Int64,1}}:
 1  2  3

, а затем, если ваша функция ожидала RowVector, она не будет выполнена.

Объявление 2. Вы можете сделать это так:

julia> f(x::Int) = y::Int -> y + x
f (generic function with 1 method)

julia> a = f(10)
#11 (generic function with 1 method)

julia> methods(a)
# 1 method for generic function "#11":
[1] (::getfield(Main, Symbol("##11#12")))(y::Int64) in Main at REPL[5]:1

Объявление 3. Рекомендуется использовать Julia 0.7 для переноса кода, потому что он печатает предупреждения о вещах, которые изменились между Julia 0.6 и Julia 1.0.

...