Frage

Ich versuche, über Kombinatoren zu lernen, und ich habe Probleme am Beispiel verstehen gegeben, bei ( Y zwingende Selbstanwendung ). Ich glaube, ich fange an, das Konzept zu begreifen, aber ich bin noch weit davon entfernt zu verstehen.

Ich möchte den folgenden Code in Python übersetzen:

     (define (U f) (f f))

     (define (fib-nr f)
       (lambda (n)
         (if (< n 2) 1 (+ ((f f) (- n 1)) ((f f) (- n 2))))))

     # Usage:   
     ((U fib-nr) 35) ;==> 14930352

Ich habe versucht, einen 'wörtlichen' Übersetzung durch Schreiben:

U = lambda u: u(u)

def fibnr(f):
    return lambda n:  1 if (n<2) else (f (f (n-1))) + (f (f (n-2)))

Aber das funktioniert nicht (ich glaube, es mit dem zu tun, hat die Funktionen innerhalb der Lambda ausgewertet werden).

So habe ich versucht, Funktion Zusammensetzung zu verwenden, wie:

# http://code.activestate.com/recipes/52902-function-composition/
class compose:
    '''compose functions. compose(f,g,x...)(y...) = f(g(y...),x...))'''
    def __init__(self, f, g, *args, **kwargs):
        self.f = f
        self.g = g
        self.pending = args[:]
        self.kwargs = kwargs.copy()

    def __call__(self, *args, **kwargs):
        return self.f(self.g(*args, **kwargs), *self.pending, **self.kwargs)


U = lambda u: compose(u, u)

def fibnr(f):
    ff = compose(f, f)
    return lambda n:  1 if (n<2) else (ff (n-1)) + (ff (n-2))

Aber immer noch nicht funktioniert, wenn mein letzten Code-Snippet Aufruf ich eine Lambda zurück:

>>> U(fibnr)(35)
<function <lambda> at 0x01A1B6B0>

So ist es möglich, eine ‚wörtliche‘ Übersetzung des gegebenen Beispiels in Python zu schreiben? Wie könnte ich es tun?

War es hilfreich?

Lösung

Ich schrieb eine einfache Übersetzung, die richtigen Ergebnisse zu produzieren scheint:

def U(f): return f(f)

def fibnr(f):
    def lam(n):
        if (n < 2): return 1
        return f(f)(n-1) + f(f)(n-2)
    return lam

Oder wenn Sie wirklich, wie Lambda-Ausdrücke:

def fibnr(f): return lambda n: 1 if (n < 2) else f(f)(n-1) + f(f)(n-2)

Ich denke, Ihr anfängliches Problem übersetzt Lisp ((f f) x) in Python f(f(x)) statt f(f)(x).

Viel Glück Verständnis combinators:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top