Partial functions?

Ah, ok. Is there any kind of speed advantage to this approach? Or is
it more of a design/DRY technique?

Dan

This communication is the property of Qwest and may contain confidential or
privileged information. Unauthorized use of this communication is strictly
prohibited and may be unlawful. If you have received this communication
in error, please immediately notify the sender by reply e-mail and destroy
all copies of the communication and any attachments.

···

-----Original Message-----
From: list-bounce@example.com
[mailto:list-bounce@example.com] On Behalf Of Jim Weirich
Sent: Thursday, May 18, 2006 8:59 AM
To: ruby-talk ML
Subject: Re: Partial functions?

Berger, Daniel wrote:
> Hi all,
>
> I'm trying to understand a new feature of Python 2.5 (PEP
309) called
> "partial functions". Here's the Python example I pulled
from Vincent
> Foley's blog:

[... curry example elided ...]

> I understand what it's doing, I just don't understand what
purpose of
> partial functions would be. Can someone provide a use case for me?

Suppose you have a collection of integers, say a = [1,2,3]. And you
wanted to create a new array consisting of all the integers in a, but
multiplied by 3. We have an array method (collect) that constructs a
new array by calling a function of one argument on each
element of the
array. Now we just need to create a function of one argument
to pass to
collect:

  # Convert a 2 arg operator (*)
  # into a 1 arg function (ie. a lambda).
  multiply_by_3 = lambda { |n| n * 3 }

  a = [1,2,3]
  a_times_3 = a.collect(&multiply_by_3)

> Also, can/should we do this in Ruby?

We do it all the time. We just don't generally bother to
give the newly
created function a name:

   a_times_3 = a.collect { |n| n * 3 }

-- Jim Weirich

> >
> > I'm trying to understand a new feature of Python 2.5 (PEP
> 309) called
> > "partial functions". Here's the Python example I pulled
> from Vincent
> > Foley's blog:
>
> [... curry example elided ...]

I think partial functions is unapropriate name. The first thing I
thought of when I read the subject of this email was the mathematical
concept of it[0].

> We do it all the time. We just don't generally bother to
> give the newly
> created function a name:
>
> a_times_3 = a.collect { |n| n * 3 }

Ah, ok. Is there any kind of speed advantage to this approach? Or is
it more of a design/DRY technique?

I think giving it a name allows you to reuse it multiple times without
rewriting it. Everytime you introduce a new name function you have a
new abstraction. You could later redefine it (e.g. for speed/space
optimization) and that change would propagate to all its uses.

Having high order functions is a nice thing to have because you can
use them to build complex functions out of simpler ones. I asked a
similar question sometime ago[1].

Cheers,
Ed

[0] Partial Function -- from Wolfram MathWorld
[1] http://tinyurl.com/rtuuz

···

On 5/18/06, Berger, Daniel <Daniel.Berger@qwest.com> wrote:

--
Encontrá a "Tu psicópata favorito" http://tuxmaniac.blogspot.com
  
Thou shalt study thy libraries and strive not to reinvent them without cause,
that thy code may be short and readable and thy days pleasant and productive.
-- Seventh commandment for C programmers

In functional languages, the compiler can reduce all the computation
involving the curried args, storing the computation.
This can make things faster.

f x y = (do_something_expensive_with x) + y
f_15 = f 15 # takes a while because reduces
            # (do_something_expensive_with 15) to a value
(1..10000).map(f_15) # executes very fast

In ruby, it makes things slower :slight_smile:
(Two calls instead of one, no caching of results.)

···

On 5/18/06, Berger, Daniel <Daniel.Berger@qwest.com> wrote:

Ah, ok. Is there any kind of speed advantage to this approach? Or is
it more of a design/DRY technique?

Exactly. Partial functions are another term for what some references
call 'recursively enumerable' functions, meaning a function that can
be computed by some Turing machine. I believe the appropriate term is
'Curried functions', from the logician who first proposed them,
someone called Haskell Curry (yes, *that* Haskell).

I've been programming in Ocaml too, and there it seems that curried
functions are extremely useful. In Ocaml most often I've used it to
call a function with several arguments multiple times with only a few
arguments changing between calls, or for passing a function with say 4
arguments to an HOF that expects a function with only one, I create a
curried function that keeps 3 of the 4 arguments fixed and pass that.
Since it is indeed possible to program in the functional style in
Ruby, I could imagine that the technique would be just as usable.

···

On 5/18/06, Edgardo Hames <ehames@gmail.com> wrote:

I think partial functions is unapropriate name. The first thing I
thought of when I read the subject of this email was the mathematical
concept of it[0].