Julia中参数类型与多重调度的交互

时间:2014-10-30 05:48:39

标签: types parameters julia

设置:在Julia中考虑参数类型

type MyType1{T1}
    x::T1
end

我使用多个调度和类型参数为此类型的单个函数定义了两个方法:

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对应于第二输入是参数的情况。我使用MyType1创建m=MyType1{Int64}(1)的实例,并注意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)

但朱莉娅抛出了这个错误:

ERROR: type: instantiate_type: expected TypeConstructor, got Function

是否可以使用指定为Int64的第二个输入来运行第二个方法,或者我是愚蠢的?

1 个答案:

答案 0 :(得分:3)

首先,我想知道你是否打算将第二个方法中的第一个参数输入为m::MyType1{T1},例如

f1{T1}(m::MyType1{T1}, i::T1) = m.x + i + 1 #Method 2b

这意味着仅当iT1类型m的类型参数具有相同类型时,第二种方法才适用。根据您的原始定义,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(根据您的系统将其类型化为Int32Int64)更多Julian并且倾向于与其他代码更好地互操作。< / p>