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