Any SML coders able to translate this to Python?
Marko Rauhamaa
marko at pacujo.net
Fri Sep 7 14:47:32 EDT 2018
Marko Rauhamaa <marko at pacujo.net>:
> 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...
... and here's the same function without cheating:
f = (lambda n:
(lambda auxf1, auxf2: auxf1(auxf1, auxf2, 0, 1, 0))(
lambda auxf1, auxf2, sum, m, i:
sum
if i == n else
auxf2(auxf1, auxf2, sum + m * i, m, i + 1),
lambda auxf1, auxf2, sum, m, i:
auxf1(auxf1, auxf2, sum, m + 1, i)
if sum % m == 0 else
auxf1(auxf1, auxf2, sum, m, i)))
... or replacing the conditional with arrays:
f = (lambda n:
(lambda auxf1, auxf2: auxf1(auxf1, auxf2, 0, 1, 0))(
lambda auxf1, auxf2, sum, m, i:
[lambda m: auxf2(auxf1, auxf2, sum + m * i, m, i + 1),
lambda m: sum][i == n](m),
lambda auxf1, auxf2, sum, m, i:
[lambda m: auxf1(auxf1, auxf2, sum, m, i),
lambda m: auxf1(auxf1, auxf2, sum, m + 1, i)][sum % m == 0](m)))
It is possible to get rid of the arrays and numbers, too. Combinatory
logic would allow us to get rid of the local variables. At the pinnacle
of functional programming is iota:
<URL: https://en.wikipedia.org/wiki/Iota_and_Jot>
The iota programming language has only one primitive value, the
Swiss-army-knife function ι, which can express Life, Universe and
Everything:
ι = lambda f: (f(lambda x: lambda y: lambda z: (x(z))(y(z))))(
lambda q: lambda i: q)
Marko
More information about the Python-list
mailing list