2011-01-14 13 views
5

Aby dowiedzieć się, czym jest i jest używany kombinator stałoprzecinkowy, napisałem własne. Ale zamiast pisać go z funkcji ściśle anonimowych, jak Wikipedia's example, po prostu stosowane określenie:Y Combinator w Scheme za pomocą Definiowanie

(define combine (lambda (functional) 
        (functional (lambda args (apply (combine functional) args)))) 

Przetestowałem to z funkcjonałów dla silni i Fibonacciego, i wydaje się działać. Czy spełnia to formalną definicję kombinatora o stałym punkcie?

+0

Ćwiczenie 2: kombinator Y bez użycia 'define' lub' letrec' :) – leppie

Odpowiedz

3

Odpowiedź brzmi nie, ponieważ według the blog referred to in the previous answer, to nawet nie spełnia definicji combinator, ponieważ „połączyć” to darmowa zmienna.

+2

Dzięki za wskazanie tego. Aby upewnić się, że definicja bloga jest poprawna, czy uważasz to za odpowiednik definicji Wikipedii: "Kombinator to funkcja wyższego rzędu, która używa tylko aplikacji funkcyjnych i wcześniej zdefiniowanych kombinatorów do zdefiniowania wyniku z jego argumentów."? Zobacz http://en.wikipedia.org/wiki/Combinatory_logic – AlcubierreDrive

5

EDYCJA: Podczas gdy chessweb lub ktokolwiek inny potwierdza swoją odpowiedź, tymczasowo rozważ swoją odpowiedź poprawnie, a ta jest błędna.


Wygląda na to, że odpowiedź brzmi "tak". Podobno pojawia się dokładnie ten sam syntezator here, w połowie drogi w dół stronie:

(define Y 
    (lambda (f) 
     (f (lambda (x) ((Y f) x))))) 
+0

Nie powinieneś. Zachęcamy do odpowiedzi na własne pytania. IIRC możesz zaakceptować własną odpowiedź w ciągu 2 dni po jej przyznaniu. –

+0

@ Yasir Świetnie, dzięki! – AlcubierreDrive

+1

Głównym celem nauczania kombinatora Y jest sprawdzenie, w jaki sposób można * zaimplementować * rekursję za pomocą tylko funkcji. Pisząc rekurencyjną definicję, nie robisz tego - kończysz więc na czymś, co działa, ale jest to przydatne tylko w zrozumieniu tego, co Y powinien zrobić. Tekst Mike'a byłby dobrym miejscem, aby przeczytać o nim dogłębnie i zobaczyć, jak powstaje wersja "zdefiniowana". –

Powiązane problemy