Any SML coders able to translate this to Python?

Marko Rauhamaa marko at pacujo.net
Fri Sep 7 13:12:08 EDT 2018


Paul Moore <p.f.moore at gmail.com>:

> On Fri, 7 Sep 2018 at 15:10, Paul Moore <p.f.moore at gmail.com> wrote:
>>
>> On Fri, 7 Sep 2018 at 14:06, Steven D'Aprano
>> <steve+comp.lang.python at pearwood.info> wrote:
>> > However I have a follow up question. Why the "let" construct in the
>> > first place? Is this just a matter of principle, "put everything in
>> > its own scope as a matter of precautionary code hygiene"? Because I
>> > can't see any advantage to the inner function:
>>
>> My impression is that this is just functional programming "good
>> style". [...]
>
> It's also worth noting that functional languages don't typically have
> variables or assignments (more accurately, such things aren't
> fundamental to the programming model the way they are in imperative
> languages). So although technically let introduces a new scope, in
> practical terms it's basically just "how functional programmers do
> assignments".

To put it succinctly, SML does it because there's no other way to
introduce local variables.

IOW, in many functional programming languages, the only local variables
are function arguments.

And if you want to go really functional, you can't even alter bindings.
So to implement a for loop in Python under these constraints, you would
implement:

    def f(n):
        sum = 0
        m = 1
        for i in range(n):
            sum += m * i
            if sum % m == 0:
                m += 1
        return sum

like this:

    def f(n):
        def auxf1(sum, m, i):
            if i == n:
                return sum
            else:
                def auxf2(sum, m, i):
                    if sum % m == 0:
                        return auxf1(sum, m + 1, i)
                    else:
                        return auxf1(sum, m, i)
                return auxf2(sum + m * i, m, i + 1)
        return auxf1(0, 1, 0)

cheating slightly with locally named functions.

If cheating is not allowed, you will need a Y combinator construct...


Marko



More information about the Python-list mailing list