Wie rufen Sie Funktionen dynamisch mit Haskell auf?

7

Ich möchte Funktionen dynamisch aufrufen, basierend auf den Inhalten in einer Zuordnungsliste.

Hier ist ein Beispiel im Semipseudocode. listOfFunctions würde an callFunctions übergeben werden.

%Vor%

Der Kern der Frage ist nicht das Durchlaufen der Liste, sondern das Aufrufen einer Funktion, sobald ich ihren Namen habe?

Betrachten Sie diesen Anwendungsfall zur weiteren Klärung. Sie öffnen die Eingabeaufforderung und werden mit dem folgenden Menü angezeigt.

  

1: Schreibe eine neue vHost-Datei

     

2: Beenden

Sie schreiben die neue vHost-Datei und erhalten kein neues Menü

  

1: Neue Direktive eingeben

     

2: Datei schreiben

     

3: Beenden

Sie geben einige neue Anweisungen für den vHost ein und sind jetzt bereit, die Datei zu schreiben.

Das Programm wird nicht blind jede Anweisung schreiben, sondern nur die, die Sie geliefert haben. Hier kommt die Assoziationsliste ins Spiel. Das Schreiben einer gigantischen if / then / else- oder case-Anweisung ist Wahnsinn. Es wäre viel eleganter, die Liste zu durchlaufen, nach den hinzugefügten Direktiven zu suchen und die Funktionen aufzurufen, sie entsprechend zu schreiben.

Daher, loop, finde einen Funktionsnamen, rufe diese Funktion mit dem angegebenen Wert auf.

Danke an alle, die mithelfen können.

Bearbeiten:

Hier ist die Lösung, die ich mir ausgedacht habe (konstruktive Kritik ist immer willkommen).

Ich habe die Funktionen exportiert, die die Direktiven in eine Assoziationsliste schreiben, da jede gegebene Antwort besagt, dass nur die Funktion mit einzubeziehen ist.

%Vor%

In der Datei, die die Hosts tatsächlich schreibt, wird diese Datei importiert.

Ich habe eine Assoziationsliste mit dem Namen hostInfo , um einen Dummy-Wert zu simulieren, der von einem Endbenutzer und einer Funktion namens runFunction , die die von < em> edalorzo um beide Listen zu filtern. Durch Abgleich der Tasten beider Listen stelle ich sicher, dass die richtige Funktion mit dem richtigen Wert aufgerufen wird.

%Vor%     
OpCodeOmega 04.04.2012, 03:12
quelle

5 Antworten

8

Da ich für Haskell ziemlich neu bin, werde ich riskieren, dass Sie meinen Vorschlag als sehr naiv betrachten, aber trotzdem geht es hier:

%Vor%

Ich denke, dass es die Anforderungen der Frage erfüllt, aber vielleicht ist das, was Sie beabsichtigen, besser als das, was ich mit meinem noch begrenzten Wissen über Haskell sehen kann.

    
Edwin Dalorzo 04.04.2012, 03:25
quelle
16

Sie können die Funktion einfach direkt in die Liste aufnehmen; Funktionen sind Werte, daher können Sie sie anhand ihres Namens in einer Liste referenzieren. Sobald Sie sie aus der Liste entfernt haben, ist die Anwendung genauso einfach wie func value . Es ist nicht nötig, ihre Namen einzubeziehen.

    
ehird 04.04.2012 03:17
quelle
2

Es könnte ein bisschen Overkill sein (ich stimme der Argumentation von ehird zu), aber Sie können eine Zeichenfolge mit Haskell-Code auswerten, indem Sie die Funktion eval in System.Eval.Haskell .

BEARBEITEN

Wie bereits in den Kommentaren erwähnt, ist der Hinweis eine bessere Möglichkeit, Strings mit Haskell-Ausdrücken zu bewerten. Zitieren der Seite:

  

Diese Bibliothek definiert eine Interpreter-Monade. Es erlaubt, Haskell-Module zu laden, sie zu durchsuchen, Zeichenfolgen mit Haskell-Ausdrücken zu prüfen und zu bewerten und sie sogar in Werte zu zwingen. Die Bibliothek ist Thread-sicher und typsicher (sogar die Numerierung von Ausdrücken auf Werte). Es ist im Wesentlichen eine große Teilmenge der GHC-API, die in eine einfachere API eingebettet ist. Funktioniert mit GHC 6.10.x und 6.8.x

    
Óscar López 04.04.2012 03:22
quelle
1

Zuerst definieren wir unsere Liste von Funktionen. Dies könnte mit mehr Maschinen gebaut werden, aber um nur ein Beispiel zu nennen, mache ich nur eine explizite Liste:

%Vor%

Dann können wir jedoch aus dieser Liste auswählen und die Funktion ausführen:

%Vor%

und es funktioniert (wenn Sie Data.Maybe importieren):

%Vor%     
Thomas M. DuBuisson 04.04.2012 03:19
quelle
1

Speichern Sie die Funktionen nicht als Zeichenfolgen, sondern versuchen Sie, die eigentlichen Funktionen zu speichern und sie dann mit einer Zeichenfolge zu versehen. Auf diese Weise können Sie die Funktion direkt aufrufen. Funktionen sind Werte erster Klasse, daher können Sie die Funktion mit dem Namen aufrufen, dem Sie sie zuweisen.

    
Josh Infiesto 04.04.2012 03:22
quelle

Tags und Links