gpt4 book ai didi

templates - 不允许依赖于 Julia 中类型定义中的整数类型参数的表达式

转载 作者:行者123 更新时间:2023-12-03 08:03:04 24 4
gpt4 key购买 nike

我想围绕 FixedSizeArrays.Vec{N,T} 定义一个类型,其中 N 是类型参数的函数:

using FixedSizeArrays

type MT{N}
x::Vec{N,Int}
y::Vec{N+1,Int}
end

这会导致错误消息:
ERROR: MethodError: `+` has no method matching +(::TypeVar, ::Int64)
Closest candidates are:
+(::Any, ::Any, ::Any, ::Any...)
+(::Int64, ::Int64)
+(::Complex{Bool}, ::Real)
...

显然,即使可以在编译时知道结果,也不允许使用带有整数类型参数的简单算术。有没有人知道这个限制的解决方法?

最佳答案

Apparently, simple arithmetic for with integer type parameters is not allowed



是的,这是类型参数的限制。解决此问题的标准方法是使用第二个类型参数。然后,您可以使用内部构造函数强制执行参数不变量:
type MT{N,Np1}
x::Vec{N,Int}
y::Vec{Np1,Int}
function MT(x,y)
N+1==Np1 || throw(ArgumentError("mismatched lengths; y must be one element longer than x"))
new(x,y)
end
end
# Since we define an inner constructor, we must also provide the
# outer constructor to allow calling MT without parameters
MT{N,M}(x::Vec{N,Int}, y::Vec{M,Int}) = MT{N,M}(x,y)

例子:
julia> MT(Vec(1,2,3),Vec(1,2,3,4))
MT{3,4}(FixedSizeArrays.Vec{3,Int64}((1,2,3)),FixedSizeArrays.Vec{4,Int64}((1,2,3,4)))

julia> MT(Vec(1,2,3),Vec(1,2,3))
ERROR: ArgumentError: mismatched lengths; y must be one element longer than x

关于templates - 不允许依赖于 Julia 中类型定义中的整数类型参数的表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34073243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com