MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Pure functions?

  • 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"?


  • Prev by Date: Re: Re: notation using # with exponents and &
  • Next by Date: Re: compelling evaluation
  • Previous by thread: Design by Contracts in Mathematica