Function tuples

John Colvin john.loughran.colvin at gmail.com
Fri Mar 14 10:10:51 PDT 2014


On Friday, 14 March 2014 at 16:38:00 UTC, bearophile wrote:
> This comes from a Rosettacode entry:
> http://rosettacode.org/wiki/First-class_functions#D
>
>
> import std.stdio, std.math, std.typetuple, std.functional;
>
> enum static sin  = (in real x) pure nothrow => std.math.sin(x),
>             asin = (in real x) pure nothrow => std.math.asin(x),
>             cos  = (in real x) pure nothrow => std.math.cos(x),
>             acos = (in real x) pure nothrow => std.math.acos(x),
>             cube = (in real x) pure nothrow => x ^^ 3,
>             cbrt = (in real x) /*pure*/ nothrow => 
> std.math.cbrt(x);
>
> void main() {
>     alias dir = TypeTuple!(sin,  cos,  cube);
>     alias inv = TypeTuple!(asin, acos, cbrt);
>     foreach (immutable i, f; dir) {
>         writefln("%6.3f %6.3f",
>                  compose!(f, inv[i])(0.5),
>                  compose!(dir[i], inv[i])(0.5));
>     }
> }
>
> It prints:
>
>  0.500  0.500
>  0.866  0.500
>  0.713  0.500
>
> Do you know why there's such difference in the results?
>

It's a bug, and quite a wierd one at that. See the output from 
this: http://dpaste.dzfl.pl/1962d61bb185

> (You can't define a staticZip in D?)

You can. I hope it will end up in in std.meta, along with a whole 
load of other such goodies that I've been working on :)


More information about the Digitalmars-d-learn mailing list