6

Wyobraź sobie proste (składa się) Język, w którym funkcje wyglądać następująco:Czy istnieje związek między wywołaniem funkcji a instancją obiektu w czystych językach funkcjonalnych?

function f(a, b) = c + 42 
    where c = a * b 

(mówią, że jest podzbiorem Lisp, który obejmuje „defun” i „daj”.)

wyobrazić również, że zawiera niezmienne obiektów, które wyglądają tak:

struct s(a, b, c = a * b) 

Ponownie analogizing do Lisp (tym razem rozszerzeniem), powiedzmy definicja struct tak by wygenerować funkcje:

make-s(a, b) 
s-a(s) 
s-b(s) 
s-c(s) 

Teraz, biorąc pod uwagę prostą konfigurację, wydaje się jasne, że istnieje wiele podobieństw między tym, co dzieje się za kulisami, gdy użytkownik nazywa "f" lub "make-s". Po dostarczeniu "a" i "b" w czasie wywołania/utworzenia instancji, istnieje wystarczająca ilość informacji do obliczenia "c".

Można myśleć o utworzeniu struktury jako o nazwie wywołującej funkcję, a następnie przechowywaniu wynikowego środowiska symbolicznego do późniejszego użycia po wywołaniu wygenerowanych funkcji akcesora. Możesz też pomyśleć o ocenie wartości funkcji, która jest jak tworzenie ukrytej struktury, a następnie wykorzystywanie jej jako symbolicznego środowiska do oceny końcowego wyniku wyrażenia.

Czy mój model zabawek jest tak uproszczony, że jest bezużyteczny? A może jest to przydatny sposób myślenia o tym, jak działają prawdziwe języki? Czy są jakieś prawdziwe języki/implementacje, że ktoś bez tła CS, ale z zainteresowaniem w językach programowania (tj. Ja) powinien dowiedzieć się więcej o tym, aby zbadać tę koncepcję?

Dzięki.

EDYCJA: Dzięki za odpowiedzi do tej pory. Aby trochę się zastanowić, myślę, że zastanawiam się, czy istnieją prawdziwe języki, w których mówi się ludziom, którzy uczą się tego języka. "powinieneś pomyśleć o przedmiotach jako zasadniczo zamknięciach". Lub, jeśli istnieją jakieś rzeczywiste implementacje językowe, gdzie jest tak, że tworzenie wystąpienia obiektu i wywoływanie funkcji rzeczywiście mają wspólne częste (nietrywialne, to znaczy nie tylko wywołania biblioteki) kod lub struktury danych.

Czy analogia, którą robię, o której wcześniej słyszałem, wykracza głębiej niż zwykła analogia w rzeczywistych sytuacjach?

+0

Cóż, z pewnością istnieje analogia. 'make-s' może być postrzegany jako fabryka, która z definicji jest funkcją. I rzeczywiście uznałem za interesujące, choć nie zbyt ważne dla mojego kodowania-fu, myślenie o metodach (w tym fabrykach/konstruktorach) jako funkcjach i zakresie funkcji jako symbolu (/ string) => odwzorowaniu wartości. Python wykonuje oba. +1, ponieważ uwielbiam takie rzeczy. – delnan

+0

Podobne informacje: http://stackoverflow.com/questions/2497801/closures-are-poor-mans--pjects-and-vice-versa-what-does-this-mean – missingfaktor

Odpowiedz

1

Zarówno f i make-s są funkcjami, ale podobieństwo nie wykracza znacznie dalej. Zastosowanie f wywołuje funkcję i wykonuje jej kod; zastosowanie make-s tworzy strukturę.

W większości implementacji językowych i modelizations, make-s jest inny rodzaj obiektu od f: f jest zamknięcie, natomiast make-s jest konstruktorem (w językach funkcjonalnych i logicznego sensu, który jest zbliżony do obiektowe języki znaczenia) .

Jeśli chcesz myśleć w sposób zorientowany obiektowo, zarówno f, jak i make-s mają metodę zastosowania, ale mają zupełnie inne implementacje tej metody.

Jeśli chcesz myśleć w kategoriach podstawowej logiki, f i make-s mają typ budowany na konstruktorze typu samme (konstruktor typu funkcji), ale są konstruowane na różne sposoby i mają różne reguły niszczenia (funkcja aplikacji kontra aplikacja konstruktora).

Jeśli chcesz zrozumieć ten akapit, polecam Types and Programming Languages Benjamina C. Pierce'a. Struktury są omówione w § 11.8.

+0

Jest to również bardzo przydatna odpowiedź. – jtolle

+0

Chociaż zaakceptowałem tę odpowiedź, ponieważ myślę, że najbardziej bezpośrednio dostaje się to, o czym się zastanawiałem, chciałbym podkreślić odpowiedź z @dave poniżej. Pomiędzy tymi dwoma, myślę, że można bezpiecznie powiedzieć, że odpowiedź brzmi: "żadne języki, w których się rozwijasz, nie są implementowane w ten sposób, ale coś wystarczająco skróconego (jak interpretator rachunku różniczkowego lambda) mogłoby równie dobrze być". – jtolle

1

Istnieje związek między obiektami i zamknięciami. http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

Poniższa stwarza to, co niektórzy mogą wywołać funkcję, a inni mogą nazwać obiekt:
Zrobione z SICP (http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-21.html)

(define (make-account balance) 
    (define (withdraw amount) 
    (if (>= balance amount) 
     (begin (set! balance (- balance amount)) 
       balance) 
     "Insufficient funds")) 
    (define (deposit amount) 
    (set! balance (+ balance amount)) 
    balance) 
    (define (dispatch m) 
    (cond ((eq? m 'withdraw) withdraw) 
      ((eq? m 'deposit) deposit) 
      (else (error "Unknown request -- MAKE-ACCOUNT" 
         m)))) 
    dispatch) 
+0

Dzięki za linki. Wiem, że istnieje analogia między przedmiotami i zamknięciami. Zobacz moją edycję na moje pytanie, ale zastanawiam się, czy kiedykolwiek pójdzie głębiej niż tylko analogia, przynajmniej w przypadku związku pomiędzy tworzeniem niezmiennego obiektu i wywoływaniem funkcji. – jtolle

1

Czy mój model zabawka tak uproszczony, że jest bezużyteczny?

Zasadniczo tak. Twój uproszczony model w zasadzie sprowadza się do stwierdzenia, że ​​każda z tych operacji wymaga wykonania obliczeń i umieszczenia wyniku w dowolnym miejscu. Ale to jest tak ogólne, że obejmuje wszystko, co robi komputer. Jeśli nie wykonałeś obliczeń, nie zrobiłbyś nic użytecznego. Jeśli nie umieściłbyś gdzieś wyniku, wykonalibyśmy pracę za darmo, ponieważ nie masz możliwości uzyskania wyniku.Więc wszystko, co robisz z komputerem, od dodania dwóch rejestrów do pobrania strony internetowej, może być modelowane jako wykonywanie obliczeń i umieszczanie wyniku w miejscu, do którego można później uzyskać dostęp.

+0

Zarówno ta odpowiedź, jak i z5h są dla mnie pomocne, ale zobacz moje edytowane pytanie i komentarz pozostawiony w odpowiedzi z5h. Oczywiście analogia, jaką opisałeś, jest bezużyteczna. Ale próbowałem go ograniczyć ... do tworzenia obiektów niezmiennych i wywoływania funkcji. Czy to robi różnicę? – jtolle

3

Nie można uzyskać dużo czystszego niż rachunek lambda: http://en.wikipedia.org/wiki/Lambda_calculus. Rachunek lambda jest tak czysty, ma tylko funkcje!

Standardowym sposobem wykonania parę w rachunku lambda jest tak:

pair = fn a: fn b: fn x: x a b 
first = fn a: fn b: a 
second = fn a: fn b: b 

Więc pair a b, co można nazwać „struct”, w rzeczywistości jest funkcją (fn x: x a b). Ale jest to specjalny rodzaj funkcji zwany zamknięciem. Zamknięcie jest zasadniczo funkcją (fn x: x a b) plus wartości dla wszystkich "wolnych" zmiennych (w tym przypadku a i b).

Tak, tworzenie wystąpienia "struct" jest jak wywoływanie funkcji, ale co ważniejsze, sama "struct" sama w sobie jest jak specjalny typ funkcji (zamknięcie).

Jeśli myślisz o tym, jak zaimplementować interpreter różnicy lambda, możesz zobaczyć symetrię z drugiej strony: możesz zaimplementować zamknięcie jako wyrażenie plus strukturę zawierającą wartości wszystkich wolnych zmiennych.

Przepraszam, jeśli to wszystko jest oczywiste i po prostu chcieliśmy trochę prawdziwego przykładu świecie ...

+0

Jest to bardzo pomocne. Prawdziwym meta-pytaniem dla mnie jest nauczenie się myślenia o różnych językach nie jako worków z niezależnymi składnikami syntaktycznymi, które można łączyć, by robić rzeczy, ale jako powiązane (aczkolwiek ze specyficznymi składniami) "opakowania" dla bardziej podstawowych pojęć. Dzięki! – jtolle

+3

@jtolle: Może zainteresuje cię książka * Pojęcia, techniki i modele programowania komputerowego * autorstwa Petera van Roya i Seifa Haridiego. Twierdzą, że języki programowania mogą być rozkładane zgodnie z * Paradygmatami *, które obsługują (na przykład OOP lub Programowanie Logiczne), a te paradygmaty można dalej rozłożyć na * Koncepcje *. Peter van Roy ma ten świetny plakat z * Klasyfikacją Paradygmatów Głównego Programowania *, który wymienia 34 paradygmaty, które składają się z około 18 pojęć. A więc te "podstawowe pojęcia", których szukasz ... nawet * nazywają je * tym! –

+0

@ Jorg W Mittag, dzięki za to polecenie! Zarezerwuj stronę tutaj: http://www.info.ucl.ac.be/~pvr/book.html, link do swobodnie dostępnej wersji roboczej opublikowanej przez autora tutaj: http://lambda-the-ultimate.org/node/3108 # comment-45392, Plakat tutaj: http://www.info.ucl.ac.be/~pvr/paradigms.html, dostępny wyglądający ("paradygmaty programowania dla manekinów") artykuł tutaj: http://www.info. ucl.ac.be/~pvr/VanRoyChapter.pdf – jtolle

Powiązane problemy