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:
Mit P
kann ich jetzt ein neues Prädikat erstellen, das eine Kombination von Prädikaten wie folgt ist:
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?
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:
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:
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.
Sie könnten das Infix-Operator-Rezept verwenden:
%Vor%ergibt
%Vor%Tags und Links python pointfree predicate function-composition