digitalmars.D.learn - Map Purity
- jmh530 (14/14) Jun 28 2015 My understanding of pure is that a function labeled pure can only
- Xinok (6/20) Jun 28 2015 Map isn't explicitly marked as pure. D can infer purity for
- "Marc =?UTF-8?B?U2Now7x0eiI=?= <schuetzm gmx.net> (15/29) Jun 28 2015 There are two aspects to that. First, purity in D is less strict
My understanding of pure is that a function labeled pure can only include pure functions. I've been confused by the fact that a function calling map (like below) can be labeled pure without any problems. The only way I can rationalize it is that map really isn't a function, it's (if I'm understanding it correctly) a template that creates a template function that calls a struct template. auto test_map(T)(T x) pure { return x.map!(a => a + a); } This is related to http://forum.dlang.org/thread/ppmokalxdgtszzllzorb forum.dlang.org?page=1 but maybe my question is more basic.
Jun 28 2015
On Sunday, 28 June 2015 at 15:55:51 UTC, jmh530 wrote:My understanding of pure is that a function labeled pure can only include pure functions. I've been confused by the fact that a function calling map (like below) can be labeled pure without any problems. The only way I can rationalize it is that map really isn't a function, it's (if I'm understanding it correctly) a template that creates a template function that calls a struct template. auto test_map(T)(T x) pure { return x.map!(a => a + a); } This is related to http://forum.dlang.org/thread/ppmokalxdgtszzllzorb forum.dlang.org?page=1 but maybe my question is more basic.Map isn't explicitly marked as pure. D can infer purity for templated functions, so as long as you give it a pure predicate, map can be inferred as pure. This only works for templated functions; non-templated functions must be explicitly marked as pure.
Jun 28 2015
On Sunday, 28 June 2015 at 15:55:51 UTC, jmh530 wrote:My understanding of pure is that a function labeled pure can only include pure functions. I've been confused by the fact that a function calling map (like below) can be labeled pure without any problems. The only way I can rationalize it is that map really isn't a function, it's (if I'm understanding it correctly) a template that creates a template function that calls a struct template. auto test_map(T)(T x) pure { return x.map!(a => a + a); } This is related to http://forum.dlang.org/thread/ppmokalxdgtszzllzorb forum.dlang.org?page=1 but maybe my question is more basic.There are two aspects to that. First, purity in D is less strict than the concept in functional programming languages. It allows access (even mutation) to anything that is reachable through the parameters. David Nadlinger has written a nice article about the concept and its implications: http://klickverbot.at/blog/2012/05/purity-in-d/ Secondly, `map` is indeed a template function, as you write. For templates functions, the compiler infers many properties, including purity. Neither the `map` function nor the constructor of the struct it returns do anything impure, therefore they are treated as pure. And indeed, the return value of `test_map` will only depend on its arguments, which is the first requirement for purity, and of course it doesn't change global state either, which fulfills the second requirement.
Jun 28 2015
On Sunday, 28 June 2015 at 16:15:31 UTC, Marc Schütz wrote:Secondly, `map` is indeed a template function, as you write. For templates functions, the compiler infers many properties, including purity.Thanks for the reply. Two follow ups: 1) Does labeling a template as pure matter if the compiler infers it anyway? 2) Does the compiler also infer anything for safe/nothrow in templates?
Jun 28 2015
On Sunday, 28 June 2015 at 16:28:20 UTC, jmh530 wrote:Thanks for the reply. Two follow ups: 1) Does labeling a template as pure matter if the compiler infers it anyway? 2) Does the compiler also infer anything for safe/nothrow in templates?1) It means you can't instantiate the template function with arguments that would make it non-pure. 2) Yes, pure, nothrow, safe, nogc are all inferred.
Jun 28 2015