2015-10-23 11 views
7

Es gibt ein Stück Sourcecode ist, die another one of my questions in einer Antwort entstand,Haskell - ist das ein Verschluss?

infFromPrefix :: Eq a => ([a] -> [a]) -> [a] -> [a] 
infFromPrefix rules prefix = inf where 
    inf = prefix ++ case stripPrefix prefix (rules inf) of 
     Just suffix -> suffix 
     Nothing  -> error "Substitution does not preserve prefix" 

, wo ich ziemlich sicher bin, dass inf ein Verschluss sein müssen, da sie Zugriff auf Variablen von seinem umgebenden Gültigkeitsbereich im Sinne hat, dass es verwendet die an infFromPrefix übergebenen Parameter, aber bin unsicher, da im Wesentlichen infFromPrefix und inf die gleiche Funktion ist, erlaubt die inf nur eine prägnantere Definition. Eine äquivalente Definition würde

infFromPrefix rules prefix = prefix ++ case stripPrefix prefix (rules $ infFromPrefix rules prefix) of 
     Just suffix -> suffix 
     Nothing  -> error "Substitution does not preserve prefix" 

Am sein, die ich korrigieren, ist inf ein Verschluss?

+0

Ich würde "Nein" sagen, weil 'inf' keine Funktion ist; Es ist eine Liste. – melpomene

+5

@melpomene Ich denke in eifrigen Sprachen ist es sinnvoll, die Schließungen auf Funktionen zu beschränken; in faulen Sprachen bin ich mir nicht so sicher. Zumindest wäre ich bereit zu wetten, dass GHC eine Datenstruktur hat, die es "Schließung" nennt, die auf irgendeiner Ebene "Inf" darstellt. –

+0

@melpomene Sie haben Recht, sonst würden Regeln es nicht als Eingabe akzeptieren. Prost. –

Antwort

4

Basierend auf dem Wiki-Artikel auf Closures in programming, ich denke, es kann gesagt werden, dass inf in der Tat ist nicht ein Verschluss:

Hinweis vor allem, dass die verschachtelten Funktionsdefinitionen sind nicht selbst Schließungen: sie ein frei haben Variable, die noch nicht gebunden ist. Nur wenn die umschließende Funktion mit einem Wert für den Parameter ausgewertet wird, wird die freie Variable der geschachtelten Funktionsgrenze gebunden, wodurch ein Abschluss erzeugt wird, der dann von der umschließenden Funktion zurückgegeben wird.

+0

Ich stimme dir zu, da Haskell Lazy ist, kann alles als eine Schließung angesehen werden, da sogar ein Wert als eine Funktion ohne Argument angesehen werden kann, die darauf wartet, ausgewertet zu werden (und so seine Umgebung zu erfassen, bis sie ausgewertet wird). – mb14

+2

"[A] s sogar ein Wert kann als eine Funktion ohne Argument gesehen werden." Nicht wirklich, nein. –

10

Ich würde Lennart und Daniel zustimmen, dass die Schließung ein implementationsspezifischer Begriff ist und im Allgemeinen nicht gut definiert ist. Außerdem höre ich Haskeller nicht viel über Schließungen außerhalb der Umsetzungsprobleme. Wenn Programmierer in anderen Sprachen beiläufig von "Schließungen" sprechen, meinen sie gewöhnlich das, was wir "Lambdas" nennen. (Wie in "hat diese Sprache Schließungen?".)

Wie auch immer, lassen Sie uns über GHC sprechen.

GHC (oder präziser STG) ruft ein Closure-Objekt auf, das kein Heap-Objekt ist, das keine Konstruktoranwendung ist.

(Falls Sie denken, dies eine weit gefasste Definition ist, vergleichen diese mit dem Original STG Papier, wo auch Konstrukteure Verschlüsse genannt wurden.)

Ihre inf ist sicherlich ein STG-Verschluss; Es ist ein Thunk, der auf dem Heap zugewiesen und an den Aufrufer zurückgegeben wird.

+0

_ "zurück zum Anrufer" _ - der Anrufer welcher Funktion? 'inf' oder' infFromPrefix'? Ich bin mir nicht sicher, wie Sie Ihre Antwort in den Zusammenhang stellen können, wie [Wikipedia eine Schließung definiert] (https://en.m.wikipedia.org/wiki/Closure_ (computer_programming)). –

+0

'infFromPrefix' konstruiert einen Abschluss/Thunk auf dem Heap," inf "und gibt (den Zeiger auf) es an seinen Aufrufer (' infFromPrefix') zurück. Der Anrufer wird dann den Abschluss eingeben, um ihn im erforderlichen Umfang zu bewerten. –

+2

@ErikAllik Vielleicht ist ein Teil des Problems, dass die Leute hier (und im Wikipedia-Artikel) nicht auf den Unterschied zwischen statischen Objekten - Brocken der Syntax in einer Sprache - und dynamischen Objekten achten - Dinge, die gebaut und inspiziert werden zur Laufzeit. Zu sagen, dass "inf" selbst keine Schließung ist, scheint technisch korrekt zu sein, da es ein statisches Objekt ist und nur dynamische Objekte Verschlüsse sein können; aber zu sagen, dass zur Laufzeit der Ausdruck 'inf' in einen Abschluss verwandelt wird, wenn' infFromPrefix' aufgerufen wird, scheint auch korrekt zu sein. –