julia 0.6

时间:2017-05-30 12:33:07

标签: julia

我对如何使用where语法在julia 0.6中使用抽象类型限制参数类型的类型参数表示怀疑。

考虑我想要制作一个采用整数的参数抽象类型的示例,并定义从中继承的结构。如果我尝试:

abstract type AbstractFoo{T} where T<: Integer end

它失败了,但我可以使用非where语法

abstract type AbstractFoo{T<:Integer} end
  1. 这是推荐的格式吗?
  2. 鉴于此,我如何实现我的子类型

    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)

2 个答案:

答案 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

关于问题:

  1. 是的,是正确且唯一正确的格式
  2. 有效且T将限制为Foo(2),但您可能会收到更糟糕的错误消息,因为它来自Integer,而不是AbstractFoo。您的用户可能不会注意到FooFoo的子类型并且感到困惑。
  3. 这是有意的,也是引入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

对我来说,将参数限制在具体类型而不是抽象类型上似乎是最合理的。