В Python нет необходимости в Y-Combinator? - PullRequest
4 голосов
/ 19 февраля 2012

После часа попыток понять Y-Combinator ... я наконец получил его, в основном, но потом я понял, что то же самое можно достичь без него ... хотя я не уверен, полностью ли я понимаю, что этоцель.

например.Факториалы с Y-Combinator

print (lambda h: (lambda f:f(f))(lambda f: h(lambda n: f(f)(n))))(lambda g: lambda n: n and n * g(n-1) or 1)(input())

Факториалы, имеющие ссылку на функцию в другой лямбде

print (lambda f,m:f(f,m))((lambda g,n: n and n * g(g,n-1) or 1),input())

Может кто-нибудь сказать, если есть цель для Y-Combinator впитон

Ответы [ 2 ]

8 голосов
/ 19 февраля 2012

Цель комбинатора Y - показать, как написать произвольную рекурсивную функцию, используя только анонимные функции. Но почти каждый язык, когда-либо изобретенный, допускает именованные функции! Другими словами, это в основном представляет академический интерес. Конечно, вы можете определить факториалы гораздо более «естественно» в Python:

def fac(n):
    return n * fac(n-1) if n else 1

Единственными языками, на которых Y-комбинатор действительно полезен на практике, являются языки "тьюринговых тарпитов", такие как Unlambda. Даже пользователи Lisp / Scheme обычно не используют Y-комбинатор при написании реальных программ.

3 голосов
/ 19 февраля 2012

Python не основан на лямбда-исчислении; когда вы задаете вопрос таким образом, это не имеет особого смысла. Оператор lambda - это просто практическая функция для создания анонимной функции на месте:

>>> list( map(lambda x: x**2, [1, 2, 3, 4, 5]) )
[1, 4, 9, 16, 25]

#    the same as:

>>> def sq(x):
...     return x**2
...
>>> list( map(sq, [1, 2, 3, 4, 5]) )
[1, 4, 9, 16, 25]

Он назван так, потому что он заимствован из функциональных языков, но не для вычислений с комбинаторной логикой.

...