当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《不允许使用依赖于Julia中类型定义中的整数类型参数的表达式》经验,为你挑选了1个好方法。

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

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)
  ...

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



1> Matt B...:

显然,不允许使用整数类型参数的简单算术

是的,这是类型参数的限制.解决此问题的标准方法是使用第二个类型参数.然后,您可以使用内部构造函数强制执行参数不变量:

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

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有