higher-order functions
bearophile
bearophileHUGS at lycos.com
Sun Oct 31 16:20:04 PDT 2010
Simen kjaeraas:
> They take both, in fact:
>
> auto cubes = map!((a){ return a*a*a; })(arr);
But that needs to be compile-time constant, so if you have several functions, you need to put them inside a typetuple, or duplicate the code. And some idioms are just not possible.
You may see it well here regarding the "compose":
http://rosettacode.org/wiki/First-class_functions#D
import std.stdio, std.typetuple, std.functional;
private import std.math;
void main() {
// wrappers needed as not all built-in functions
// have same signature, eg pure/nothrow
auto sin = (real x) { return std.math.sin(x); };
auto asin = (real x) { return std.math.asin(x); };
auto cos = (real x) { return std.math.cos(x); };
auto acos = (real x) { return std.math.acos(x); };
auto cube = (real x) { return x ^^ 3; };
auto cbrt = (real x) { return std.math.cbrt(x); };
alias TypeTuple!(sin, cos, cube) dir;
alias TypeTuple!(asin, acos, cbrt) inv;
foreach (i, f; dir)
writefln("%6.3f", compose!(f, inv[i])(0.5));
}
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list