2012-02-19 3 views
4

После часа, пытаясь понять Y-Combinator ... я, наконец, получил его, в основном, но потом понял, что то же самое можно добиться без него ... хотя я не уверен, полностью ли я понимаю его цель ,У Python нет необходимости в 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 в Python?

+1

Как и все, дело в том, что он обучает ваш ум думать и распознавать образцы рекурсии и итерации. Это поможет вам, если вам нужно использовать функции более высокого порядка, и это поможет вам узнать, когда они будут полезны. – Marcin

ответ

8

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

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

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

3

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

>>> 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] 

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

Смежные вопросы