Forum: Ruby 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 16:30
(Received via mailing list)
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:

import functional

def multiply(x, y):
  return x * y

multiply_by_3 = functional.partial(multiply, 3)

multiply_by_3(4) #=> Will return 12

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?

Also, can/should we do this in Ruby?

Regards,

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.
D8fb06dfc08a477ecb0a76ffdbff3475?d=identicon&s=25 Chiaro Scuro (chiaroscuro)
on 2006-05-18 16:46
(Received via mailing list)
the partial function binds one of the arguments of that function, so
that
later on only the remaining arguments have to be specified.  I think
it's
also called currying.

I guess it could be done with a mix of wrapper functions and
metaprogramming.
01d68aff859065b5cbc1cfc67cb16871?d=identicon&s=25 Keith Fahlgren (Guest)
on 2006-05-18 16:49
(Received via mailing list)
On Thursday 18 May 2006 10:27 am, Berger, Daniel wrote:
> partial functions would be.  Can someone provide a use case for me?
Hey,

I believe this is just a use of currying, a way of reducing the number
of arguments to a function by ferreting some of them away (the boring
ones).

I'll give you a simple example (from last week):

# Warning, Scheme!
# .. bind zip here ..
(binary-search index (lambda (s) (string-compare zip (car s))))
# ...

BINARY-SEARCH expects two arguments, an index and a function that takes
_one_ argument. Well, I've got to compare two arguments. Thankfully,
I'm always comparing against the same zip, so I may as well "curry" it
(and store it in the function), and create a new one-argument function
on the fly. I'll pass that new function (from the LAMBDA) to
BINARY-SEARCH and it'll never know the difference.

More on currying here (and it's even not Scheme):
http://moonbase.rydia.net/mental/blog/programming/...
http://en.wikipedia.org/wiki/Currying

The Ruby library Murray was made for currying:
http://rubymurray.rubyforge.org/


HTH,
Keith
Db59927495b7db991b543d113e1835ff?d=identicon&s=25 Maurice Codik (Guest)
on 2006-05-18 16:56
(Received via mailing list)
This feature is very similar to currying:
http://en.wikipedia.org/wiki/Currying which is common in many functional
languages (ex, ML automatically curries for you).

I can't really think of a good usecase off the top of my head, but
searching
around for currying examples may help.

Maurice
10d4acbfdaccb4eee687a428ca00a5d8?d=identicon&s=25 Jim Weirich (weirich)
on 2006-05-18 16:58
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
This topic is locked and can not be replied to.