Pointfree Funktionskombination in Python

8

Ich habe einige Prädikate, z. B .:

%Vor%

und möchte sie logisch wie in kombinieren:

%Vor%

Die Frage ist jetzt: Kann eine solche Kombination in einem pointfree Stil geschrieben werden, wie zum Beispiel:

%Vor%

Dies hat natürlich nicht den gewünschten Effekt, weil der Wahrheitswert der Lambda-Funktionen True und and und or Kurzschließer sind. Am nächsten kam ich, um eine Klasse P zu definieren, die ein einfacher Prädikatcontainer ist, der __call__() implementiert und über die Methoden and_() und or_() Prädikate kombiniert. Die Definition von P lautet wie folgt:

%Vor%

Mit P kann ich jetzt ein neues Prädikat erstellen, das eine Kombination von Prädikaten wie folgt ist:

%Vor%

entspricht der obigen Lambda-Funktion. Das kommt näher zu dem, was ich gerne hätte, aber es ist auch nicht punktfrei (die Punkte sind jetzt die Prädikate selbst statt ihrer Argumente). Nun ist die zweite Frage: Gibt es einen besseren oder kürzeren Weg (vielleicht ohne Klammern und Punkte) Prädikate in Python zu kombinieren, als mit Klassen wie P und ohne (lambda) Funktionen zu arbeiten?

    
Frank S. Thomas 07.02.2012, 21:58
quelle

5 Antworten

8

Sie können den Operator & (bitweises UND) in Python überschreiben, indem Sie der Klasse __and__ eine P -Methode hinzufügen. Sie könnten dann etwas schreiben wie:

%Vor%

oder sogar

%Vor%

Ebenso können Sie den Operator | (bitweises ODER) überschreiben, indem Sie eine __or__ -Methode und den Operator ~ (bitweise Negation) hinzufügen, indem Sie eine __not__ -Methode hinzufügen. Beachten Sie, dass Sie den integrierten Operator and , or und not nicht überschreiben können, damit dies Ihrem Ziel möglichst nahe kommt. Sie müssen immer noch eine P -Instanz als das am weitesten links stehende Argument haben.

Der Vollständigkeit halber können Sie auch die In-Place-Varianten ( __iand__ , __ior__ ) und die rechten Varianten ( __rand__ , __ror__ ) dieser Operatoren überschreiben.

Codebeispiel (ungetestet, bitte korrigieren):

%Vor%

Ein weiterer Trick, um dich dem punktfreien Nirvana näher zu bringen, ist der folgende Dekorateur:

%Vor%

Sie können dann Ihre Prädikate mit dem predicate Dekorator markieren, um sie automatisch zu einer Instanz von P zu machen:

%Vor%     
Tamás 07.02.2012, 22:03
quelle
3

Grundsätzlich scheint Ihr Ansatz der einzig mögliche in Python zu sein. Es gibt ein Python-Modul auf github , das ungefähr den gleichen Mechanismus verwendet, um eine kompositionsfreie Komposition zu implementieren.

Ich habe es nicht benutzt, aber auf den ersten Blick sieht seine Lösung ein bisschen schöner aus (weil er Dekoratoren und Operatorüberladung verwendet, wo Sie eine Klasse und __call__ verwenden).

Aber anders als das ist es nicht technisch Punkt-freier Code, es ist nur "Punkt-versteckt", wenn Sie so wollen. Das kann oder kann nicht genug für dich sein.

    
rwos 07.02.2012 22:18
quelle
2

Sie könnten das Infix-Operator-Rezept verwenden:

%Vor%

ergibt

%Vor%     
WolframH 07.02.2012 22:33
quelle
1

Das wäre meine Lösung:

%Vor%

Und das ist mein Ergebnis:

%Vor%     
Niklas R 08.02.2012 13:23
quelle
1

Python hat bereits eine Möglichkeit, zwei Funktionen zu kombinieren: Lambda. Sie können ganz einfach Ihre eigenen Kompositions- und Multiple-Compose-Funktionen erstellen:

%Vor%     
Marcin 20.07.2013 16:55
quelle