I think #2 is the right solution, but I also wish there was a nicer syntax
to do it.  Here's how I'd probably tackle it... if I get around to it soon
I'll post the implementation:

@abstract type AbstractFoo
    bar::Int
end

@extend AbstractFoo type Foo
end

@extend AbstractFoo type Foobar
    baz::Float64
end

# then:
Foo <: AbstractFoo
Foobar <: AbstractFoo

and both Foo and Foobar have a field bar.

I suspect this will be dirt-simple to implement for non-parametrics, but
might be a little tricky otherwise.  It's just a matter of injecting fields
(and parameters) into the proper spot of the type definition.


On Mon, Sep 12, 2016 at 6:00 PM, Chris Rackauckas <rackd...@gmail.com>
wrote:

> Ahh, that makes a lot of sense as well. I can see how that would make
> everything a lot harder to optimize. Thanks for the explanation!
>
> On Monday, September 12, 2016 at 2:44:22 PM UTC-7, Stefan Karpinski wrote:
>>
>> The biggest practical issue is that if you can subtype a concrete type
>> then you can't store values inline in an array, even if the values are
>> immutable – since a subtype can be bigger than the supertype. This leads to
>> having things like "final" classes, etc. Fundamentally, this is really an
>> issue of failing to separate the concrete type – which is complete and can
>> be instantiated – from the abstract type, which is incomplete and can be
>> subtyped.
>>
>> On Mon, Sep 12, 2016 at 3:17 PM, Chris Rackauckas <rack...@gmail.com>
>> wrote:
>>
>>> https://en.wikipedia.org/wiki/Composition_over_inheritance
>>>
>>> http://programmers.stackexchange.com/questions/134097/why-
>>> should-i-prefer-composition-over-inheritance
>>>
>>> https://www.thoughtworks.com/insights/blog/composition-vs-in
>>> heritance-how-choose
>>>
>>> That's just the start. Overtime, people realized inheritance can be
>>> quite fragile, so many style guidelines simply forbid you from doing it.
>>>
>>> On Monday, September 12, 2016 at 11:45:40 AM UTC-7, Bart Janssens wrote:
>>>>
>>>> Looking at this example, it seems mighty tempting to have the ability
>>>> to subtype a concrete type. Are the exact problems with that documented
>>>> somewhere? I am aware of the following section in the docs:
>>>>
>>>> "One particularly distinctive feature of Julia’s type system is that
>>>> concrete types may not subtype each other: all concrete types are final and
>>>> may only have abstract types as their supertypes. While this might at first
>>>> seem unduly restrictive, it has many beneficial consequences with
>>>> surprisingly few drawbacks. It turns out that being able to inherit
>>>> behavior is much more important than being able to inherit structure, and
>>>> inheriting both causes significant difficulties in traditional
>>>> object-oriented languages."
>>>>
>>>> I'm just wondering what the "significant difficulties" are, not
>>>> advocating changing this behaviour.
>>>>
>>>> On Mon, Sep 12, 2016 at 5:28 PM Stefan Karpinski <ste...@karpinski.org>
>>>> wrote:
>>>>
>>>>> I would probably go with approach #2 myself and only refer to the .bar
>>>>> and .baz fields in all of the generic AbstractFoo methods.
>>>>>
>>>>> On Mon, Sep 12, 2016 at 10:10 AM, Michael Borregaard <
>>>>> mkborr...@gmail.com> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> I am defining a set of types to hold scientific data, and trying to
>>>>>> get the best out of Julia's type system. The types in my example are
>>>>>> 'nested' in the sense that each type will hold progressively more
>>>>>> information and thus allow the user to do progressively more. Like this:
>>>>>>
>>>>>> type Foo
>>>>>>   bar
>>>>>>   baz
>>>>>> end
>>>>>>
>>>>>> type Foobar
>>>>>>   bar  # this
>>>>>>   baz  # and this are identical with Foo
>>>>>>   barbaz
>>>>>>   bazbaz
>>>>>> end
>>>>>>
>>>>>>
>>>>>
>>

Reply via email to