Template-style polymorphism in table structure

data pulverizer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Sep 4 10:16:18 PDT 2016


On Sunday, 4 September 2016 at 14:49:30 UTC, Lodovico Giaretta 
wrote:
> On Sunday, 4 September 2016 at 14:24:12 UTC, data pulverizer 
> wrote:
>> On Sunday, 4 September 2016 at 14:20:24 UTC, data pulverizer 
>> wrote:
>> @Lodovico Giaretta BTW what do you mean that my code is not 
>> very D style? Please expand on this ...
>
> The constructors can be less. In fact, a typesafe variadic ctor 
> also works for the single element case and for the array case. 
> But you already recognized that.
>
> Instead of reinventing the wheel for your GenericVector!T, you 
> could use an `alias this` to directly inherit all operation on 
> the underlying array, without having to reimplement them (like 
> your append method).
>
> Your getCol(i) could become getCol!T(i) and return an instance 
> of GenericVector!T directly, after checking that the required 
> column has in fact that type:
>
> GenericVector!T getCol!T(size_t i)
> {
>     if(typeid(cols[i]) == typeid(GenericVector!T))
>         return cast(GenericVector!T)cols[i];
>     else
>         // assert(0) or throw exception
> }
>
> Another solution: if you don't need to dynamically change the 
> type of the columns you can have the addColumn function create 
> a new type. I show you with Tuples because it's easier:
>
> Tuple!(T,U) append(U, T...)(Tuple!T tup, U col)
> {
>     return Tuple!(T,U)(tup.expand, col);
> }
>
> Tuple!int t1;
> Tuple!(int, float) t2 = t1.append(2.0);
> Tuple!(int, float, char) t3 = t2.append('c');

Thank you for the very useful suggestions, I shall take these 
forward. On the suggestion of creating Tuple-like tables, I 
already tried that but found as you said that once the table is 
created, adding/removing columns is essentially creating a 
different data type, which needs a new variable name each time.

I am building a table type I hope will be used for data 
manipulation for data science and statistics applications, so I 
require a data structure that can allow adding and removing 
columns of various types as well as a data structure that can 
cope with any type that hasn't been planned for, which is why I 
selected this polymorphic template approach. It is more flexible 
than other data structures I have seen in dynamic programming 
languages R's data frame and Python pandas. Even Scala's Spark 
dataframes rely on wrapping everything in Any and the user still 
has to write a special data structure for each new type. The only 
thing that is similar to this approach is Julia's DataFrame but 
Julia - though a very good programming language has limitations.

I feel as if I am constantly scratching the surface of what D can 
do, but I have recently managed to get more time on my hands and 
it looks as if that will continue into the future which will mean 
more focusing on D, improving my generic programming skills and 
hopefully creating some useful artifacts. Perhaps I need to read 
Andrei's Modern C++ Design book for a better way to think about 
generics.




More information about the Digitalmars-d-learn mailing list