Article: Writing Julia style multiple dispatch code in D
    jmh530 via Digitalmars-d-announce 
    digitalmars-d-announce at puremagic.com
       
    Fri Aug 25 07:30:03 PDT 2017
    
    
  
On Friday, 25 August 2017 at 01:04:31 UTC, data pulverizer wrote:
> [snip]
With respect to your point about immutability, you might be 
interested in the parameterize function in dstats.distrib. I 
hadn't noticed that was there, but I think it accomplishes, to a 
limited extent, the behavior of what you want. It returns a 
delegate with the values of the distribution fixed in there.
Along the same lines, I think below is how I would set it up, 
rather than the mixin approach I discussed above. While it does 
not currently work with the parametrize funciton currently, I 
believe that with some simple adjustments it could.
import std.stdio : writeln;
struct Normal
{
     import dstats : normalCDF, normalCDFR, normalPDF, 
invNormalCDF;
     alias cdf = normalCDF;
     alias cdfr = normalCDFR;
     alias pdf = normalPDF;
     alias density = pdf;
     alias icdf = invNormalCDF;
}
struct LogNormal
{
     import dstats : logNormalCDF, logNormalCDFR, logNormalPDF;
     alias cdf = logNormalCDF;
     alias cdfr = logNormalCDFR;
     alias pdf = logNormalPDF;
     alias density = pdf;
     //no icdf for LogNormal in dstats
}
private void hasMemberCheck(alias T, string x)()
{
     import std.traits : hasMember;
     static assert(hasMember!(T, x), T.stringof ~ " must have " ~ 
x ~" member to
                                         call " ~ x ~ " function");
}
auto cdf(alias T, U...)(U u)
{
     hasMemberCheck!(T, "cdf");
     return T.cdf(u);
}
auto pdf(alias T, U...)(U u)
{
     hasMemberCheck!(T, "pdf");
     return T.pdf(u);
}
auto pmf(alias T, U...)(U u)
{
     hasMemberCheck!(T, "pmf");
     return T.pmf(u);
}
auto cdfr(alias T, U...)(U u)
{
     hasMemberCheck!(T, "cdfr");
     return T.cdfr(u);
}
auto density(alias T, U...)(U u)
{
     hasMemberCheck!(T, "density");
     return T.density(u);
}
auto icdf(alias T, U...)(U u)
{
     hasMemberCheck!(T, "icdf");
     return T.icdf(u);
}
void main()
{
     writeln(Normal.cdf(0.5, 0.0, 1.0));
     writeln(cdf!Normal(0.5, 0.0, 1.0));
     writeln(icdf!Normal(cdf!Normal(0.5, 0.0, 1.0), 0.0, 1.0));
     writeln(LogNormal.cdf(0.5, 0.0, 1.0));
     writeln(cdf!LogNormal(0.5, 0.0, 1.0));
     //writeln(icdf!LogNormal(cdf!LogNormal(0.5, 0.0, 1.0), 0.0, 
1.0));
     //error
}
    
    
More information about the Digitalmars-d-announce
mailing list