digitalmars.D - Current purity offenders
- bearophile (25/25) Mar 24 2011 As Phobos develops more, there are some commonly used Phobos functions t...
As Phobos develops more, there are some commonly used Phobos functions that
aren't pure yet:
import std.algorithm, std.typecons, std.conv, std.array, std.range;
pure auto foo(int[] a) {
sort(a);
auto a2 = array(iota(a.length));
return tuple(text(a), a2);
}
void main() {}
But a function like text() may call toString(), that's not always pure, so D
needs the conditionally purity to implement a conditionally pure text() (or
text code needs to be duplicated with a pure version, but probably this is not
an option).
Random number generation too is useful in pure functions, see:
http://d.puremagic.com/issues/show_bug.cgi?id=5249
// strongly pure
pure double[] foo(const int n, const double firstSeed=42) {
double seed = firstSeed;
auto res = new double[n];
foreach (ref r; res) {
auto seed_rnd = nextRandom(seed, 1.0);
r = seed_rnd.rnd;
seed = seed_rnd.seed;
}
return res;
}
When such parts of Phobos will become (conditionally) pure, it will become much
simpler to write D small programs as a small impure I/O part that calls mostly
pure functions/methods :-) Simon Peyton-Jones says this is one of the most
important qualities of Haskell, and from what I'm seeing, it's not a bad thing.
Bye,
bearophile
Mar 24 2011








bearophile <bearophileHUGS lycos.com>