(test) ? a:b

Ian Kelly ian.g.kelly at gmail.com
Thu Oct 23 16:24:07 CEST 2014

On Thu, Oct 23, 2014 at 7:44 AM, Marko Rauhamaa <marko at pacujo.net> wrote:
> However, the "[f, g][cond]()" technique is how pure lambda calculus
> implements conditional branching so it is interesting in its own right.

I wasn't aware that lambda calculus had lists and indexing built in.

> IOW, you can do "short-circuiting" in purely functional programming:
>     j = j + 1 if j < 10 else 3
>     <=>
>     j = (lambda: 3, lambda: j + 1)[j < 10]()

The implementation given by Wikipedia (and translated into Python by me) is:

>>> true = lambda x: lambda y: x
>>> false = lambda x: lambda y: y
>>> ifthenelse = lambda p: lambda a: lambda b: p(a)(b)
>>> ifthenelse(true)(1)(2)
>>> ifthenelse(false)(1)(2)

For demonstration purposes I used Python ints as the branches rather
than actual lambda calculus constructs, but this shows how selection
can be done using only lambda abstractions and applications.

In any case I don't see how this relates to the "[f, g][cond]()"
technique of Python, unless you just meant the general approach of
first selecting a function and then applying it. In that sense though,
the ternary operator does the same thing; the application is just done
invisibly by the language in the form of evaluating an expression as
opposed to explicitly applying a function.

More information about the Python-list mailing list