Forum: Ruby Re: Partial functions?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
F3b7b8756d0c7f71cc7460cc33aefaee?d=identicon&s=25 Berger, Daniel (Guest)
on 2006-05-18 17:09
(Received via mailing list)
> >
> > partial functions would be.  Can someone provide a use case for me?
>   # Convert a 2 arg operator (*)
> created function a name:
>
>    a_times_3 = a.collect { |n| n * 3 }
>
> -- Jim Weirich

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.
Cf985658ff32a83d07cdfaa22c294fe4?d=identicon&s=25 Edgardo Hames (Guest)
on 2006-05-18 17:36
(Received via mailing list)
On 5/18/06, Berger, Daniel <Daniel.Berger@qwest.com> wrote:
> > >
> > > 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] http://mathworld.wolfram.com/PartialFunction.html
[1] http://tinyurl.com/rtuuz
E20e89d58211a3631842daecc1245de2?d=identicon&s=25 Ilmari Heikkinen (Guest)
on 2006-05-19 04:00
(Received via mailing list)
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?


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 :)
(Two calls instead of one, no caching of results.)
2d3ec3a83b4f8784d6853564fa0d2e77?d=identicon&s=25 Dido Sevilla (Guest)
on 2006-05-19 05:32
(Received via mailing list)
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].
>

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.
This topic is locked and can not be replied to.