我对如何使用where
语法在julia 0.6中使用抽象类型限制参数类型的类型参数表示怀疑。
考虑我想要制作一个采用整数的参数抽象类型的示例,并定义从中继承的结构。如果我尝试:
abstract type AbstractFoo{T} where T<: Integer end
它失败了,但我可以使用非where
语法
abstract type AbstractFoo{T<:Integer} end
鉴于此,我如何实现我的子类型
mutable struct Foo{T} <: AbstractFoo{T} where T <: Integer
bar::T
end
也失败了(Invalid subtyping
)。我可以使用
where
语法
mutable struct Foo{T<:Integer} <: AbstractFoo{T}
bar::T
end
但这似乎是多余的(因为T已被限制为整数)。我可以把它留下来吗?:
mutable struct Foo{T} <: AbstractFoo{T}
bar::T
end
最后,随着内部构造函数语法的弃用,有没有办法将内部构造函数定义为:
mutable struct Foo{T} <: AbstractFoo{T}
bar::T
Foo{T}(x::T) where T = new(x)
end
这使Foo(3)
无法使用 - 要求我使用Foo{Int}(3)
。这是故意还是有更好的解决方法?
编辑:我想对于内部构造函数问题,我总是可以定义外部构造函数Foo(x::T) where {T} = Foo{T}(x)
。
答案 0 :(得分:5)
我会写:
Started POST "/tag_applications/apply" for ::1 at 2017-05-30 11:11:02 -0400
Processing by TagApplicationsController#apply as HTML
这1)将x限制为abstract type AbstractFoo{T<:Integer} end
mutable struct Foo{T} <: AbstractFoo{T}
bar::T
Foo(x::T) where T = new{T}(x)
end
2)允许写Integer
关于问题:
Foo(2)
,但您可能会收到更糟糕的错误消息,因为它来自Integer
,而不是AbstractFoo
。您的用户可能不会注意到Foo
是Foo
的子类型并且感到困惑。AbstractFoo
语法的主要目的之一。在新语法中,where
始终指定T{S}
的类型参数,T
引入函数的类型参数。因此where S
定义Foo{T}(x) where T =
应该执行的操作,Foo{Int}(2)
定义Foo(x::T) where T =
应该执行的操作。引入Foo(2)
后,再没有“内部构造函数”。您可以在任何结构中定义任何函数(不一定是该类型的构造函数),并定义类型定义之外的任何构造函数 - 唯一的区别是内部类型定义,您可以访问where
。答案 1 :(得分:2)
我在这里略显摇摇欲坠,但不久前我有一个similar问题。根据我从中学到的知识,我建议您尝试一下,看看它是如何为您工作的:
abstract type AbstractFoo{T} end
mutable struct Foo{T<:Integer} <: AbstractFoo{T}
bar::T
end
对我来说,将参数限制在具体类型而不是抽象类型上似乎是最合理的。