Python and Ruby

Steven D'Aprano steven at
Mon Feb 1 07:05:17 CET 2010

On Sun, 31 Jan 2010 20:22:36 -0800, Paul Rubin wrote:

> Terry Reedy <tjreedy at> writes:
>> Three of you gave essentially identical answers, but I still do not see
>> how given something like
>> def f(): return 1
>> I differentiate between 'function object at address xxx' and 'int 1'
>> objects.
> In the languages they are talking about, there is no such thing as a
> function with no args.  A function is closer to a mathematical function,
> i.e. a mapping from one type to another, so every function has an arg.

Suppose I have a function that queries a website 
for a list of popular names and returns the most popular name on the 
list. Obviously this name will change from time to time, so I can't just 
get it once and treat the result as a constant. 

In a non-functional language, I'd write it something like this:

def get_popular_name():
    URL = ''
    data = fetch(URL)
    names = parse(data)
    name = choose(names, 1)
    return name

name = get_popular_name()  # call the function with no argument
f = decorate(get_popular_name)  # treat the function as a 1st class object

How would Haskell coders write it? Something like this?

def get_popular_name(url):
    data = fetch url
    names = parse data
    name = choose name 1
    return name

name = get_popular_name ''  # call the function
f = decorate get_popular_name  # treat the function as a 1st class object

But now you're needlessly having the caller, rather than the function, 
remember an implementation detail of the get_popular_name function. Since 
the argument couldn't be anything different, I'd immediately think of 
applying partial:

get_popular_name = partial get_popular_name ''

but now how do I call the new function?

Is this where you say "Monads" and everyone's eyes glaze over?


More information about the Python-list mailing list