Ich bin ein Haskell-Neuling. Ich versuche eine Minisprache innerhalb von Haskell zu erstellen und möchte, wenn möglich, eine höherwertige Funktion namens opp
(kurz für "Gegenteil") haben, die eine Reihe vertrauter Funktionen in ihre offensichtlichen Gegensätze umwandelt. Zum Beispiel wäre opp succ
die Funktion pred
, opp head
wäre last
, und so weiter. Ich habe keine allgemeine Definition dessen, was es bedeutet, eine Funktion in ihr Gegenteil zu verwandeln: Ich möchte nur einige Schlüsselbeispiele auswählen und erklären, was ihre Gegensätze sind. Ich möchte also eine hochpolymorphe Funktion, die kaum definiert ist.Ist es möglich, im Einzelfall eine "umgekehrte" Funktion höherer Ordnung zu definieren?
Die Schwierigkeit scheint zu sein, dass ich die Funktionen eher durch ihre Namen als durch ihre Essenzen (sozusagen) erkennen möchte. Eine Manifestation dieser Schwierigkeit besteht darin, dass, wenn ich schreibe
opp succ = pred
dann Haskell behandelt succ
als Variable und deshalb gibt mir eine konstante Funktion, die immer den Wert nimmt pred
. Was ich wirklich will, ist etwas mehr zu sagen, "Wenn Sie jemals die Zeichenfolge opp succ
sehen, dann denken Sie darüber als ein anderer Name für pred
." Aber nachdem ich eine Weile herumgesucht habe, kann ich nicht herausfinden, wie das geht (wenn es überhaupt möglich ist).
Um es zusammenzufassen, ich möchte eine Funktion
opp :: (a -> b) -> (a -> b)
sagen Dinge wie
opp succ = pred
opp pred = succ
opp head = last
opp last = head
und zu dieser Liste hinzufügen, wann immer mir danach ist. Natürlich kann ich das nicht so machen, aber gibt es eine nicht-schreckliche Art, den gleichen Effekt zu erzielen?
Alles klar. Aber dieser Begriff des "Gegenteils" erscheint dann ziemlich vage spezifiziert. – leftaroundabout
Das ist der Punkt. Weil es keine nette Definition von "Gegenteil" gibt, möchte ich es von Fall zu Fall definieren. – user15553
@ user15553 warum haben "überhaupt" dann überhaupt? An diesem Punkt können Sie "oppPred = succ" haben und Sie verlieren keine Aussagekraft im Vergleich zu dem, was Sie in der Frage angegeben haben. –