6

Stellen Sie sich eine einfache (aus) Sprache, wo Funktionen wie folgt aussehen:Gibt es eine Beziehung zwischen dem Aufruf einer Funktion und der Instanziierung eines Objekts in reinen funktionalen Sprachen?

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

(Sag es eine Teilmenge von Lisp ist die ‚defun‘ und ‚lassen‘ enthält.)

auch vorstellen, dass es unveränderlich enthält Objekte, die wie folgt aussehen: zu Lisp

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

Again (eine Ober dieser Zeit) Analogisierung, sagen eine Struktur Definition wie das generieren würde Funktionen für:

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

Jetzt, angesichts der einfachen Einrichtung, scheint es klar zu sein, dass es viel Ähnlichkeit gibt zwischen dem, was hinter den Kulissen passiert, wenn man entweder 'f' oder 'make-s' nennt. Sobald 'a' und 'b' zum Zeitpunkt des Aufrufens/Instanziierens bereitgestellt werden, gibt es genügend Information zum Berechnen von 'c'.

Sie könnten sich vorstellen, eine Struktur so zu instanziieren, als ob sie eine Funktion aufruft, und dann die resultierende symbolische Umgebung zur späteren Verwendung speichert, wenn die generierten Accessor-Funktionen aufgerufen werden. Oder Sie könnten eine Funktion als eine Art "hidden struct" bezeichnen und dann als die symbolische Umgebung verwenden, mit der der endgültige Ergebnisausdruck bewertet werden soll.

Ist mein Spielzeugmodell so übermäßig vereinfacht, dass es nutzlos ist? Oder ist es eine hilfreiche Möglichkeit, darüber nachzudenken, wie echte Sprachen funktionieren? Gibt es echte Sprachen/Implementierungen, bei denen jemand ohne CS-Hintergrund, aber mit Interesse an Programmiersprachen (d. H. Ich), mehr darüber lernen sollte, um dieses Konzept zu erforschen?

Danke.

EDIT: Danke für die Antworten bisher. Um ein wenig zu erläutern, ich denke, was ich mich wundere, ist, wenn es irgendwelche echten Sprachen gibt, in denen Leute, die die Sprache lernen, z. "Sie sollten Objekte als im Wesentlichen Verschlüsse denken". Oder, wenn es reale Sprachimplementierungen gibt, wo der Fall, dass ein Objekt instanziiert wird und eine Funktion aufruft, tatsächlich einige gemeinsame (nicht-triviale, d. H. Nicht nur Bibliotheksaufrufe) Code- oder Datenstrukturen aufweist.

Hat die Analogie, die ich kenne, die ich vorher schon einmal gemacht habe, in jeder realen Situation tiefer als eine bloße Analogie?

+0

Nun, es gibt sicherlich eine Analogie. 'make-s' könnte als Fabrik gesehen werden, die definitionsgemäß eine Funktion ist. Und ich fand es zwar interessant, wenn auch nicht zu relevant für meine Kodierung-fu, über Methoden (einschließlich Fabriken/Konstruktoren) als Funktionen und den Anwendungsbereich einer Funktion als Symbol (/ string) => Wertemapping nachzudenken. Python macht beides. +1, weil ich solche Dinge liebe. – delnan

+0

Art von verwandten: http://stackoverflow.com/questions/2497801/closures-are-poor-mands-objects-and-vice-versa-what-does-this-mean – missingfaktor

Antwort

1

Beide f und make-s sind Funktionen, aber die Ähnlichkeit nicht viel weiter geht. Das Anwenden von f ruft die Funktion auf und führt ihren Code aus; Anwendung make-s erstellt eine Struktur.

in den meisten Sprechen Implementierungen und Modellierungen ist make-s eine andere Art von Objekt aus f: f ist ein Verschluss, während make-s ein Konstruktor ist (in den funktionalen Sprachen und logische Bedeutung, die Bedeutung der objektorientierte Sprache Nähe) .

Wenn Sie gerne objektorientiert denken, haben sowohl f als auch make-s eine Anwendungsmethode, aber sie haben völlig andere Implementierungen dieser Methode.

Wenn Sie in Bezug auf die zugrunde liegende Logik denken, f und make-s eine Art bauen auf dem samme Typkonstruktor haben (die Funktion Typkonstruktor), aber sie sind auf unterschiedliche Weise konstruiert und haben Regeln unterschiedliche Zerstörung (Funktionsanwendung vs. Konstruktoranwendung).

Wenn Sie diesen letzten Absatz verstehen möchten, empfehle ich Types and Programming Languages von Benjamin C. Pierce. Strukturen werden in §11.8 diskutiert.

+0

Dies ist auch eine sehr hilfreiche Antwort. – jtolle

+0

Obwohl ich diese Antwort akzeptiert habe, weil ich denke, dass es am direktesten bei dem ankommt, worüber ich mich gewundert habe, möchte ich die Antwort von @dave unten hervorheben. Zwischen den Beiden kann man mit Sicherheit sagen, dass die Antwort lautet: "Keine Sprachen, die man entwickelt, werden auf diese Weise implementiert, aber etwas, das ausreichend abgespeckt ist (wie ein Lambda-Kalkül-Interpreter), könnte durchaus sein". – jtolle

1

Es gibt eine Beziehung zwischen Objekten und Verschlüsse. http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/msg03277.html

Die folgende schafft, was einige eine Funktion nennen könnte, und andere vielleicht ein Objekt nennen:
von SICP Genommen (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

Danke für die Links. Ich weiß, dass es eine Analogie zwischen Objekten und Schließungen gibt. Sehen Sie meine Bearbeitung zu meiner Frage, aber ich frage mich, ob es jemals tiefer geht als nur eine Analogie, zumindest für den Fall der Beziehung zwischen der Instantiierung eines unveränderlichen Objekts und dem Aufruf einer Funktion. – jtolle

1

Ist mein Spielzeug-Modell so stark vereinfacht, dass es nutzlos ist?

Im Wesentlichen ja. Ihr vereinfachtes Modell läuft im Grunde darauf hinaus, zu sagen, dass jede dieser Operationen eine Berechnung durchführt und das Ergebnis irgendwo platziert. Aber das ist so allgemein, es deckt alles ab, was ein Computer tut. Wenn Sie keine Berechnung durchführen würden, würden Sie nichts Nützliches tun. Wenn du das Ergebnis nicht irgendwo hingelegt hättest, hättest du für nichts gearbeitet, weil du keine Möglichkeit hast, das Ergebnis zu bekommen.So könnte alles Nützliche, das Sie mit einem Computer tun, vom Hinzufügen von zwei Registern bis zum Abrufen einer Webseite, so modelliert werden, dass eine Berechnung durchgeführt wird und das Ergebnis irgendwo platziert wird, auf das später zugegriffen werden kann.

+0

Sowohl diese Antwort als auch z5h's sind hilfreich für mich, aber sehen Sie meine bearbeitete Frage und den Kommentar, den ich auf z5hs Antwort hinterlassen habe. Offensichtlich ist die Analogie, wie Sie sie beschrieben haben, nutzlos. Aber ich versuchte es zu beschränken ... zur Instanziierung unveränderlicher Objekte und zum Aufruf von Funktionen. Macht das einen Unterschied? – jtolle

3

Sie können nicht viel reiner als Lambda-Kalkül erhalten: http://en.wikipedia.org/wiki/Lambda_calculus. Lambda-Kalkül ist in der Tat so rein, es hat nur Funktionen!

Ein Standard-Weg ein Paar in Lambda-Kalkül der Umsetzung ist in etwa so:

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

So pair a b, was man eine "Struktur" nennen könnte, tatsächlich eine Funktion (fn x: x a b). Aber es ist eine spezielle Art von Funktion, die als Schließung bezeichnet wird. Ein Abschluss ist im Wesentlichen eine Funktion (fn x: x a b) plus Werte für alle "freien" Variablen (in diesem Fall a und b).

Also, instanziieren eine "Struktur" ist wie das Aufrufen einer Funktion, aber noch wichtiger, die eigentliche "Struktur" selbst ist wie eine spezielle Art von Funktion (eine Schließung).

Wenn Sie darüber nachdenken, wie Sie einen Lambda-Kalkül-Interpreter implementieren würden, können Sie die Symmetrie von der anderen Seite sehen: Sie könnten einen Abschluss als Ausdruck plus eine Struktur implementieren, die die Werte aller freien Variablen enthält.

Sorry, wenn dies alles klar ist und Sie wollten nur einige Beispiele aus der Praxis ...

+0

Dies ist sehr hilfreich. Die wirkliche Meta-Frage für mich ist, dass ich lernen muss, verschiedene Sprachen nicht als Taschen von unabhängigen syntaktischen Elementen zu betrachten, die kombiniert werden können, um Dinge zu tun, sondern als verwandte (wenn auch mit spezifischen Syntaxen) "Wrapper" für grundlegendere Konzepte. Vielen Dank! – jtolle

+3

@jtolle: Sie könnten sich für das Buch * Konzepte, Techniken und Modelle der Computerprogrammierung * von Peter van Roy und Seif Haridi interessieren. Sie argumentieren, dass Programmiersprachen nach den von ihnen unterstützten * Paradigmen * (zum Beispiel OOP oder Logic Programming) zerlegt werden können, und diese Paradigmen können weiter in * Concepts * zerlegt werden. Peter van Roy hat dieses großartige Poster mit der * Klassifikation der wichtigsten Programmier-Paradigmen *, die 34 Paradigmen auflistet, die aus etwa 18 Konzepten bestehen. Also, diese "fundamentalen Konzepte", nach denen du suchst ... sie nennen sie sogar! –

+0

@Jorg W Mittag, danke für diese Empfehlung! Buchen Sie die Seite hier: http://www.info.ucl.ac.be/~pvr/book.html, Link zum frei verfügbaren Entwurf des Autors hier: http://lambda-the-ultimate.org/node/3108 # comment-45392, Poster hier: http://www.info.ucl.ac.be/~pvr/paradigms.html, zugänglicher ("Programmierparadigmen für Dummies") Artikel hier: http://www.info. ucl.ac.be/~pvr/VanRoyChapter.pdf – jtolle

Verwandte Themen