[plt-scheme] Why do layman programmers care about Currying?
On Jan 2, 2009, at 7:57 AM, Grant Rettke wrote:
> On Tue, Dec 30, 2008 at 11:44 PM, Richard Cleis <rcleis at me.com> wrote:
>> On Dec 30, 2008, at 9:12 PM, Grant Rettke wrote:
>>> Why do layman (working programmers) care about Currying? Or how are
>>> they applied in daily use to help one out?
>>
>> I'm not sure if you are referring to 'using a function that curries
>> other
>> functions,' or if you mean (as the wikisnip says) "if you fix some
>> arguments, you get a function of the remaining arguments." I
>> manually do the
>> latter frequently, and it's one of the reasons I like Scheme so much.
>
> I don't understand the practical application of currying in Scheme, so
> I'm not asking about one or the other; the wikipedia link was just my
> going in position on trying to understand what is currying.
>
> When you do apply the latter, what are the idioms or patterns that you
> most often encounter?
I often encounter core functions of at least several arguments, most
or all of which are results of independent computations of diverse
complexity. Efficiency is enhanced by ordering the arguments by
complexity and using Curry-related closures. The organization of the
program tends to be more appealing to me since variables contain
intermediate functions of specific meaning, rather than specific data
that are used by a generally-named core function. In other words,
Currying permits repeated use of intermediate functions as an
alternative to overtly managing arguments to a core function.
> I understand the idea of using bindings to capture state, but I don't
> see how that translates into normal usage. For example, if you write
>
> (define (((foo a) b) c)
> (λ () (do-something-to a b c)))
>
> you will get a function back 3 times, but only the third time is the
> result you expect. How do you know when to stop, keep track of how
> many times you called it? Is this a good example?
The earlier post,
http://list.cs.brown.edu/pipermail/plt-scheme/2009-January/029418.html
is a specific example of producing intermediate functions using
keywords. Below is a way to use the Currying form that you present.
The function that would return 'earth' is used much less often than
the core function. The function that would return 'telescope' is used
more often, but not as much as the core function. The outer function
would then be used perhaps thousands or millions of times to generate
flightpaths of one or more ufos.
(define (((view-info earth) telescope) ufo)
(string-append "Geometric calcs of: " ufo ", " telescope ", " earth))
(((view-info "earth at 12:00") "big telescope") "green ufo at 12:01")
; a test, but not practical
(define use-earth-at-12:00 (view-info "earth at 12:00"))
(define view-from-starfire (use-earth-at-12:00 "starfire telescope"))
(define view-from-firepond (use-earth-at-12:00 "firepond telescope"))
(define ufos (list "green-ufo-at-12:01" "green-ufo-at-12:02" "red-ufo-
at-12:01"))
(map view-from-starfire ufos)
(map view-from-firepond ufos)
Welcome to DrScheme, version 4.1 [3m].
Language: Module; memory limit: 128 megabytes.
"Geometric calcs of: green ufo at 12:01, big telescope, earth at 12:00"
("Geometric calcs of: green-ufo-at-12:01, starfire telescope, earth at
12:00"
"Geometric calcs of: green-ufo-at-12:02, starfire telescope, earth
at 12:00"
"Geometric calcs of: red-ufo-at-12:01, starfire telescope, earth at
12:00")
("Geometric calcs of: green-ufo-at-12:01, firepond telescope, earth at
12:00"
"Geometric calcs of: green-ufo-at-12:02, firepond telescope, earth
at 12:00"
"Geometric calcs of: red-ufo-at-12:01, firepond telescope, earth at
12:00")
>
rac
"We ascribe beauty to that which is simple."
--Ralph Waldo Emerson
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20090102/3788d3bf/attachment.html>