Verfasst eine Kette von 2-Argument-Funktionen

8

Ich habe also eine Liste von Funktionen zweier Argumente vom Typ [a -> a -> a]

Ich möchte eine Funktion schreiben, die die Liste aufnimmt und zu einer Kette von Funktionen zusammenfasst, die Länge + 1 Argumente auf der linken Seite benötigt. Zum Beispiel, wenn ich [f,g,h] alle Typen [a -> a -> a] habe, muss ich eine Funktion schreiben, die gibt:

%Vor%

Auch wenn es hilft, sind die Funktionen in ihren Argumenten kommutativ (d. h. f x y = f y x für alle x y ).

Ich kann dies innerhalb eines Listenverständnisses tun, vorausgesetzt, dass ich die Anzahl der in Frage stehenden Funktionen kenne, es wäre fast genau wie die Definition. Es ist die Strecke von einer festen Anzahl von Funktionen zu einer dynamischen Zahl, die mich ratlos macht.

Das habe ich bisher:

%Vor%

Ich denke, die Logik ist auf dem richtigen Weg, es gibt einfach keine Überprüfung.

Vielen Dank im Voraus!

    
Stephen Diehl 08.12.2011, 17:45
quelle

2 Antworten

8

Der Kommentar von n.m. ist korrekt - dies kann nicht auf herkömmliche Weise durchgeführt werden, da der Typ des Ergebnisses von der Länge der Eingabeliste abhängt. Sie brauchen ein viel schickeres System, um das zu schaffen. Sie könnten in Haskell Kompromisse eingehen, indem Sie eine Liste verwenden, die seine Länge im Typ codiert, aber das ist schmerzhaft und umständlich.

Da Ihre Argumente alle vom selben Typ sind, können Sie besser eine Funktion erstellen, die statt mehrerer Argumente eine Werteliste enthält. Der gewünschte Typ ist also etwa so: chain :: [a -> a -> a] -> [a] -> a

Es gibt mehrere Möglichkeiten, eine solche Funktion zu schreiben. Konzeptuell möchten Sie von der Vorderseite der Argumentliste und dem Ende der Funktionsliste beginnen und dann die erste Funktion auf das erste Argument anwenden, um etwas vom Typ a -> a zu erhalten. Von dort aus wenden Sie diese Funktion auf das nächste Argument an, wenden Sie dann die nächste Funktion auf das Ergebnis an, entfernen Sie ein Element aus jeder Liste und geben Sie eine neue Funktion vom Typ a -> a .

Sie müssen den Fall behandeln, in dem die Listenlängen nicht korrekt übereinstimmen. Es gibt keinen anderen Weg, als die oben genannten, vom Typ kodierten Längen und die damit verbundenen Schwierigkeiten.

    
C. A. McCann 08.12.2011, 18:10
quelle
1

Ich frage mich, ob Ihre Anforderung "eine Liste von Funktionen enthalten" eine echte Anforderung oder eine Umgehungslösung ist? Ich war mit dem gleichen Problem konfrontiert, aber in meinem Fall war der Funktionsumfang klein und zur Kompilierzeit bekannt. Um genau zu sein, war meine Aufgabe, 4 Listen mit xor zu zippen. Und alles, was ich wollte, ist eine kompakte Notation, um 3 binäre Funktionen zu komponieren. Was ich benutzt habe, ist ein kleiner Helfer:

%Vor%

Zum Beispiel:

%Vor%

Das beantwortet die ursprüngliche Frage nicht so, wie sie ist, aber die Hoffnung kann immer noch hilfreich sein, da sie ziemlich genau beschreibt, um welche Frage es in der Betreffzeile geht.

    
wonder.mice 16.02.2014 02:00
quelle

Tags und Links