- To: mathgroup at smc.vnet.net
- Subject: [mg93204] Pure functions?
- From: AES <siegman at stanford.edu>
- Date: Fri, 31 Oct 2008 03:05:06 -0500 (EST)
- Organization: Stanford University
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"?