函数在语言版本迁移中不匹配参数,以及如何知道函数的签名
Function not matching parameters in language version migration, and how to know the signature of a function
我正在将我的一些代码从旧版本的 Julia 迁移到 Julia 1.0.0。
虽然我已经调整了基本的(类型 -> 可变结构,不可变 -> 结构),但我收到错误
ERROR: LoadError: MethodError: no method matching ...
不匹配的函数在函数 returned 中(也就是说,我使用一个函子来改变函数的行为 returns 通过改变函数的参数闭包的内部函数)。问题出在 returned 函数中(如果这对问题有影响,我不知道)。
问题是:
- 这在迁移代码中常见吗?发生了什么事?
- 有没有办法打印函数的签名来调试问题? (我尝试了
tipeof(f)
但没有 return 需要的信息)。
- 你知道调试这些签名不匹配问题的实用方法吗?
提前致谢。
广告 1. 当您传递给函数的类型发生变化并且函数签名受到限制时,可能会发生这种情况。例如,在 Julia 0.6 中,您有以下 return 类型的 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 之间发生变化时打印警告。
我正在将我的一些代码从旧版本的 Julia 迁移到 Julia 1.0.0。 虽然我已经调整了基本的(类型 -> 可变结构,不可变 -> 结构),但我收到错误
ERROR: LoadError: MethodError: no method matching ...
不匹配的函数在函数 returned 中(也就是说,我使用一个函子来改变函数的行为 returns 通过改变函数的参数闭包的内部函数)。问题出在 returned 函数中(如果这对问题有影响,我不知道)。
问题是:
- 这在迁移代码中常见吗?发生了什么事?
- 有没有办法打印函数的签名来调试问题? (我尝试了
tipeof(f)
但没有 return 需要的信息)。 - 你知道调试这些签名不匹配问题的实用方法吗?
提前致谢。
广告 1. 当您传递给函数的类型发生变化并且函数签名受到限制时,可能会发生这种情况。例如,在 Julia 0.6 中,您有以下 return 类型的 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 之间发生变化时打印警告。