RosettaCodeData/Task/Y-combinator/D/y-combinator.d

26 lines
731 B
D
Raw Permalink Normal View History

2013-04-11 01:07:29 -07:00
import std.stdio, std.traits, std.algorithm, std.range;
2014-01-17 05:32:22 +00:00
auto Y(S, T...)(S delegate(T) delegate(S delegate(T)) f) {
static struct F {
S delegate(T) delegate(F) f;
alias f this;
}
return (x => x(x))(F(x => f((T v) => x(x)(v))));
2013-04-11 01:07:29 -07:00
}
2014-01-17 05:32:22 +00:00
void main() { // Demo code:
auto factorial = Y((int delegate(int) self) =>
(int n) => 0 == n ? 1 : n * self(n - 1)
);
2013-04-11 01:07:29 -07:00
2014-01-17 05:32:22 +00:00
auto ackermann = Y((ulong delegate(ulong, ulong) self) =>
(ulong m, ulong n) {
if (m == 0) return n + 1;
if (n == 0) return self(m - 1, 1);
return self(m - 1, self(m, n - 1));
2013-04-11 01:07:29 -07:00
});
2014-01-17 05:32:22 +00:00
writeln("factorial: ", 10.iota.map!factorial);
writeln("ackermann(3, 5): ", ackermann(3, 5));
2013-04-11 01:07:29 -07:00
}