Re: Pure functions?
- To: mathgroup at smc.vnet.net
- Subject: [mg93260] Re: Pure functions?
- From: David Bailey <dave at Remove_Thisdbailey.co.uk>
- Date: Sat, 1 Nov 2008 05:10:54 -0500 (EST)
- References: <geee7b$a9g$1@smc.vnet.net>
AES wrote: > This is a follow-on to the thread "Notation using # with exponents and > &", renamed to focus on the question in the Subject line. > > In asking questions about the term pure function, I'm not trying to be > contentious or argumentative. I'm just trying to learn a bit about the > concept. > > When I search on this term in Google, Wikipedia is the first hit that > comes up, with the opening statement: > > -------------------- > In computer programming, a function may be described as pure > if both these statements about the function hold: > > 1. The function always evaluates the same result value given > the same argument value(s). The function result value cannot > depend on any hidden information or state that may change as > program execution proceeds, nor can it depend on any external > input from I/O devices. > > 2. Evaluation of the result does not cause any semantically > observable side effect or output, such as mutation of mutable > objects or output to I/O devices. > > The result value need not depend on all (or any) of the argument > values. However, it must depend on nothing other than the > argument values. > --------------------- > > I appreciate that Wikipedia is not always authoritative; and its > coverage of this particular topic is neither lengthy nor particularly > detailed. Still, it's what's in there, at the moment. > > The Mathematica documentation for & opens with: > > --------------------- > 'body &' is a pure function. The formal parameters are > # (or #1), #2, etc. > --------------------- > > and then shortly thereafter: > > --------------------- > When Function[body] or body& is applied to a set of arguments, > # (or #1) is replaced by the first argument, #2 by the second, > and so on. #0 is replaced by the function itself. > --------------------- > > So let's consider the constructs: > > f1 = #1^3 + #2^4 & > f2 = #1^x + #2^y & > > both of which function perfectly well (I think) as pure functions in the > Mathematica sense. > > My initial (and admittedly naive) interpretation is that f1 is also a > pure function per the Wiki definition, because it "always evaluates the > same result value given the same argument value(s)" and "the function > result value [does not] depend on any hidden information or state that > may change as program execution proceeds" (unless of course someone > goes so far as to redefine the meanings of "3" or of "4"!). > > The function f2 is not pure in the Wiki sense, however (at least, that's > my again admittedly naive interpretation), because f2[arg1,arg2] can > give very different results when used in different parts of a program, > since its result depends on "hidden" information (hidden in some sense, > anyway) about the values that may have been assigned to the parameters x > and y elsewhere in the program. > > And, given the quotes from the Mathematica definition, it seems clear > that x and y are not "formal parameters" or accessible "arguments" of > the function f2. So, the result of f2 does clearly "depend on > [something] other than [just] the argument values". > > Finally, Mathematica seems to put some focus on the _unnamed_ (or > "anonymous") property of its pure functions, while the Wiki statement > makes no mention at all of this. > > So, what _is_ the real story on "pure functions"? > Clearly it is an unfortunate clash of terminology - surely there isn't much more to say on this! David Bailey http://www.dbaileyconsultancy.co.uk