Self-referential tuples?

Idan Arye via Digitalmars-d digitalmars-d at puremagic.com
Tue Jun 9 16:43:47 PDT 2015


On Tuesday, 9 June 2015 at 23:04:41 UTC, Andrei Alexandrescu 
wrote:
> On 6/9/15 3:58 PM, Timon Gehr wrote:
>> On 06/09/2015 05:28 PM, Andrei Alexandrescu wrote:
>>> Following the use of This in Algebraic
>>> (https://github.com/D-Programming-Language/phobos/pull/3394), 
>>> we can
>>> apply the same idea to Tuple, thus allowing one to create
>>> self-referential types with ease.
>>>
>>> Consider:
>>>
>>> // A singly-linked list is payload + pointer to list
>>> alias List(T) = Tuple!(T, This*);
>>>
>>> // A binary tree is payload + two children
>>> alias Tree(T) = Tuple!(T, This*, This*);
>>> // or
>>> alias Tree(T) = Tuple!(T, "payload", This*, "left", This*, 
>>> "right");
>>>
>>> // A binary tree with payload only in leaves
>>> alias Tree2(T) = Algebraic!(T, Tuple!(This*, This*));
>>>
>>> Is there interest in this? Other application ideas to 
>>> motivate the
>>> addition?
>>>
>>>
>>> Andrei
>>
>> Well, the issue is with this kind of use case:
>>
>> alias List(T)=Algebraic!(Tuple!(),Tuple!(T,This*));
>
> So a list is either nothing, or a head and a tail. What is the 
> problem here? -- Andrei

The `This*` here is not mapped to 
`Algebraic!(Tuple!(),Tuple!(T,This*))` - it's mapped to the 
closest containing tuple, `Tuple!(T,This*)`. This means that the 
tail is not a list - it's a head and a tail. The list is either 
empty or infinite.

At any rate, I think this feature is useful enough even if it 
doesn't support such use cases. You can always declare a list as 
a regular struct...


More information about the Digitalmars-d mailing list