Types Julia中参数类型的交互和多重分派 安装程序:考虑朱丽亚中的参数类型 type MyType1{T1} x::T1 end
我使用多个分派和类型参数为该类型上的单个函数定义了两种方法:Types Julia中参数类型的交互和多重分派 安装程序:考虑朱丽亚中的参数类型 type MyType1{T1} x::T1 end,types,parameters,julia,Types,Parameters,Julia,我使用多个分派和类型参数为该类型上的单个函数定义了两种方法: 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对应于第二个输入是参数化的情况。我使用m=MyType1{Int64}(1)创建了MyType1的一个实例,注意m.x现在返回1 问题1:我目睹了以下行为: In : f1(m, 1.0) Ou
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对应于第二个输入是参数化的情况。我使用m=MyType1{Int64}(1)
创建了MyType1
的一个实例,注意m.x
现在返回1
问题1:我目睹了以下行为:
In : f1(m, 1.0)
Out : 3.0
好的,所以我没有在函数调用中提供任何关于T1
的信息。Julia推断它应该执行方法2,理由是第二个输入不是Int64
。这就是引擎盖下的工作原理吗
问题2:假设我想调用第二个方法,但第二个输入是Int64
。显然,f1(m,1)
将不起作用,因为它将调用第一个方法。我试过这个:
In : f1{Int64}(m, 1)
但是Julia犯了这个错误:
ERROR: type: instantiate_type: expected TypeConstructor, got Function
有可能让第二个方法使用指定为
Int64
的第二个输入运行,还是我太傻了?首先,我想知道您是否打算将第二个方法中的第一个参数键入为m::MyType1{T1}
,例如
f1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1 #Method 2b
这意味着第二种方法仅适用于i
与m
类型的T1
类型参数具有相同类型的情况。使用原始定义,T1
将只与实际参数i
具有的任何类型相匹配,因此您不妨编写它f1(m::MyType1,i::Any)=……
1)使用方法2b而不是方法2,我得到
julia> f1(m, 1.0)
ERROR: no method f1(MyType1{Int64}, Float64)
因为没有适用的方法。
在您最初的案例中,方法1不适用,但方法2适用。Julia选择适用的最具体的方法,例如方法2。因此,可以说选择方法2是因为第二个输入不是Int64
2)显式类型参数(至少到目前为止)仅支持类型,不支持函数调用。invoke
函数允许调用指定的函数并根据给定的(更一般的)参数类型列表选择方法,但我不确定是否适用于此处,因为对于MyType{Int64}
,这两个方法适用于第二个参数的完全相同类型。无论哪种方式,不建议使用invoke
都是通用的,我认为这会对性能造成相当大的损失
如果您真的希望在这种情况下能够调用方法2,那么您应该找到另一种方法,在这种方法中,您不必对抗多个分派。一种选择是将方法2的实现拉入其自身的功能中,例如
f1(m::MyType1, i::Int64) = m.x + i #Method 1
f1{T1}(m::MyType1{T1}, i::T1) = g1(m, i) #Method 2b
g1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1
如果要使用第二种方法,可以直接调用g1
顺便说一句,您使用
Int64
的具体原因是什么?除非您明确需要64位,否则使用Int
(根据您的系统,它的类型别名为Int32
或Int64
)更具朱利安风格,并且倾向于与其他代码更好地互操作。首先,我想知道您是否打算将第二个方法中的第一个参数键入为m::MyType1{T1}
,例如
f1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1 #Method 2b
这意味着第二种方法仅适用于i
与m
类型的T1
类型参数具有相同类型的情况。使用原始定义,T1
将只与实际参数i
具有的任何类型相匹配,因此您不妨编写它f1(m::MyType1,i::Any)=……
1)使用方法2b而不是方法2,我得到
julia> f1(m, 1.0)
ERROR: no method f1(MyType1{Int64}, Float64)
因为没有适用的方法。
在您最初的案例中,方法1不适用,但方法2适用。Julia选择适用的最具体的方法,例如方法2。因此,可以说选择方法2是因为第二个输入不是Int64
2)显式类型参数(至少到目前为止)仅支持类型,不支持函数调用。invoke
函数允许调用指定的函数并根据给定的(更一般的)参数类型列表选择方法,但我不确定是否适用于此处,因为对于MyType{Int64}
,这两个方法适用于第二个参数的完全相同类型。无论哪种方式,不建议使用invoke
都是通用的,我认为这会对性能造成相当大的损失
如果您真的希望在这种情况下能够调用方法2,那么您应该找到另一种方法,在这种方法中,您不必对抗多个分派。一种选择是将方法2的实现拉入其自身的功能中,例如
f1(m::MyType1, i::Int64) = m.x + i #Method 1
f1{T1}(m::MyType1{T1}, i::T1) = g1(m, i) #Method 2b
g1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1
如果要使用第二种方法,可以直接调用g1
顺便说一句,您使用
Int64
的具体原因是什么?除非您明确需要64位,否则使用Int
(根据您的系统,它的类型别名为Int32
或Int64
)更具朱利安风格,并且倾向于与其他代码更好地互操作。首先,我想知道您是否打算将第二个方法中的第一个参数键入为m::MyType1{T1}
,例如
f1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1 #Method 2b
这意味着第二种方法仅适用于i
与m
类型的T1
类型参数具有相同类型的情况。使用原始定义,T1
将只与实际参数i
具有的任何类型相匹配,因此您不妨编写它f1(m::MyType1,i::Any)=……
1)使用方法2b而不是方法2,我得到
julia> f1(m, 1.0)
ERROR: no method f1(MyType1{Int64}, Float64)
因为没有适用的方法。
在您最初的案例中,方法1不适用,但方法1适用