Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types Julia中参数类型的交互和多重分派 安装程序:考虑朱丽亚中的参数类型 type MyType1{T1} x::T1 end_Types_Parameters_Julia - Fatal编程技术网

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适用