函数在语言版本迁移中不匹配参数,以及如何知道函数的签名

时间:2018-09-01 19:20:19

标签: migration julia method-signature

我正在将一些代码从旧版本的Julia迁移到Julia 1.0.0。 尽管我已经适应了基本的类型(类型->可变结构,不可变->结构),但出现错误

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

不匹配的函数位于函数返回的函数中(也就是说,我使用的函子通过闭包更改内部函数的参数来更改函数返回的行为)。问题出在返回的函数中(如果这会影响问题,我不知道)。

问题是:

  1. 在迁移代码中这很常见吗?发生了什么事?
  2. 是否有一种方法可以打印功能的签名以调试问题? (我尝试过tipeof(f),但未返回所需信息)。
  3. 您知道调试这些签名不匹配问题的实用方法吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

广告1.当您传递给函数的类型更改并且函数签名受限制时,可能会发生。例如,在Julia 0.6中,您具有以下返回类型transpose

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

以及在Julia 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之间更改的内容上显示警告。