如何在Julia中使用向量作为类型参数

3
这与我之前的问题类似,但稍微复杂一些。
之前,我定义了一个类型,其中包含一个关联的整数作为参数,Intp{p}。现在,我想使用向量作为参数来定义一个类型。
以下是我能够编写的最接近我所需求的代码:
type Extp{g::Vector{T}}
     c::Vector{T}
end

换句话说,Extp应该相对于一个向量g进行定义,我希望内容c是另一个向量,其条目应与g的条目类型相同。

好吧,这行不通。

问题1:我认为我不能在类型参数中使用::。

问题2:我可以通过使g和c的类型任意并确保向量中的类型在构造函数中匹配来解决这个问题。但是,即使我完全取出所有内容并使用

type Extp{g}
     c
end

仍然似乎不喜欢这样。当我尝试按照自己的方式使用它时,

julia> Extp {[1,1,1]}([0,0,1])

ERROR: type: apply_type: 在Extp中,期望Type{T<:Top}类型,得到Array{Int64,1}

那么,Julia是不是不喜欢将特定向量与类型关联?我所尝试的只能在整数中工作,就像我的Intp问题一样吗?

编辑:在文档中,我看到类型参数“实际上可以是任何类型(或者实际上是一个整数,虽然在这里它显然被用作类型)”。这是否意味着我正在问的是不可能的,而且这只有类型和整数适用于类型参数?如果是这样,为什么?(是什么使整数在Julia中以这种方式比其他类型更特殊?)

2个回答

5
在Julia 0.4中,您可以将任何"bitstype"用作类型的参数。然而,向量不是一个"bitstype",所以这样做是行不通的。最接近的模拟方法是使用元组:例如,(3.2, 1.5) 是一个完全有效的类型参数。
在某种程度上,向量(或任何可变对象)与类型是相对立的,因为类型不能在运行时更改。

1
它们可以是用户定义类型的元组吗?我尝试创建了一个类型T{Tuple},并且T{(1, 2, 3)}初始化成功了,但是T{(Intp{2}(1),Intp{2}(0)}则不行(其中Intp{p}是我定义的不可变Intp{p} <: Integer)。 - Alexander Gruber

2
这里是相关引用:
"抽象类型和具体类型都可以通过其他类型和某些其他值(目前为整数、符号、布尔值及其元组)进行参数化。"
因此,您的编辑是正确的。在Julia的问题页面上也提到了扩展这个问题(例如,我找到了两个相关问题#5102#6081,其中有一些讨论),所以这可能会在未来发生变化——虽然我猜想不会在v0.4中。它必须是一个不可变类型才能有任何意义��因此不能使用Vector。我不确定您的应用程序,但是Tuple是否可以使用?

这是构建多项式商环的工作。现有的向量Vector {T}足以表示任意类型系数的多项式。但是,给定一个多项式g(X)(表示为一个向量),我想创建一种类型,在该类型中,其他多项式会自动按模g(X)降阶。问题在于我希望让T保持任意性,以便例如,我可以将多项式模g(X)的多项式制成多项式模h(X)的多项式。 - Alexander Gruber
所以,如果您了解抽象代数,我正在扩展到GF(q) = GF(p)[x]/(g(x)),然后扩展到GF(q)[X]/(h(X)) = (GF(p)[x]/(g(x)))[X]/(h(X))。 g(x)和h(X)是不可变的也没关系,但是h(X)具有不可变的系数,它必须是向量元组。 - Alexander Gruber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接