Funktionssynthese und Anwendung in Python

Empfehlung der Funktionssynthese - Einführung in die funktionale Sprache für objektorientierte Programmierer Teil 1

Empfehlung der Funktionsanwendung - Einführung in die Funktionssprache für objektorientierte Programmierer Teil 2

Ich habe einen Artikel wie den oben genannten gefunden, also dachte ich, ich würde ihn auch gerne mit Python machen, also habe ich ihn ein wenig ausprobiert.

Zunächst aus der Implementierung der Funktion zur Funktionssynthese (g ≤ f) (x) = g (f (x))

def compose(f_t_u, f_u_r):
    '''
    :type f_t_u: t -> u
    :type f_u_r: u -> r
    :rtype: t -> r

    >>> comp(lambda a: a + 'oppai', lambda b: b + 'hoge')('')
    'oppaihoge'
    >>> comp(comp(lambda a: a+'oppai', lambda b: b+ 'hoge'), lambda x: '[' + x + ']')('')
    '[oppaihoge]'
    '''
    return lambda t: f_u_r(f_t_u(t))

Ich habe versucht, so etwas wie einen Typkommentar einzufügen, aber es ist nicht bekannt, ob es leichter zu lesen ist.

Die Funktionszusammensetzung erfolgt übrigens oben, aber die Klammern sind voll. Scala Ich bin mir nicht sicher, aber der ursprüngliche Artikel scheint Operatoren und implizite Typkonvertierungen zu verwenden, um Klammern zu entfernen. Scala hatte Angst

Python kann den Oleore-Operator jedoch überhaupt nicht definieren. Hier werden wir also an der Neutralisierung der Funktion arbeiten. Jeder liebt "ror", "or" Überladung und schreibt die Komposition neu.

class infix(object):
    def __init__(self, function):
        self.function = function

    def __ror__(self, other):
        self.left = other
        return self

    def __or__(self, other):
        return self.function(self.left, other)

    def __call__(self, value1, value2):
        return self.function(value1, value2)

@infix
def c(f_t_u, f_u_r): return lambda t: f_u_r(f_t_u(t))

Nun, damit


(str.upper |c| sorted |c| set)('abcdeabc')
# > set(['A', 'C', 'B', 'E', 'D'])

Sie können jetzt so schreiben.

Zum Schluss implementieren wir einen Container namens Ap, der in Teil 2 des Originalartikels erscheint. Verwenden Sie den richtigen Bitverschiebungsoperator, um die Funktion zu übernehmen und entsprechend zu verwenden.

class Ap(object):
    def __init__(self, val):
        self.val=val
    def __rshift__(self, func):
        return func(self.val)

Mit diesem Kerl


Ap('abcdeabc') >> (str.upper |c| sorted |c| set)
# > set(['A', 'C', 'B', 'E', 'D'])

Ich kann jetzt schreiben. Ich habe es getan.

Es sind noch Klammern übrig, aber es ist in Ordnung zu beenden. Ich mag das, weil es interessant ist, aber ich denke nicht, dass es praktisch ist, weil ich nicht denke, dass es Python-ähnlich ist.

# Nachtrag

Implementierung der Ap-Klasse


class _Ap(object):
    def __rlshift__(self, other):
        self.value = other
        return self

    def __rshift__(self, other):
        return other(self.value)
Ap = _Ap()
a = Ap

Wenn Sie tun


'abcdacb' <<a>> (str.upper |c| sorted)
#> ['A', 'A', 'B', 'B', 'C', 'C', 'D']

Es ist so. Dies ist eine visuelle Annäherung an den Originalartikel und vermittelt ein besseres Gefühl (?)

Nachtrag:

Obwohl es weniger vielseitig ist, habe ich auch etwas geschrieben, das eine Haskell-ähnliche Atmosphäre hat, die eine Funktionskomposition mit . ermöglicht.

[Haskells Kompositionsoperator. In Python ~ Implementierung der Sammlungsverarbeitung durch Funktionskomposition](https://hachibeechan.hateblo.jp/entry/implements-the-haskells-compose-function-in-python-and-list- wird bearbeitet)

Recommended Posts

Funktionssynthese und Anwendung in Python
Ich habe Funktionssynthese und Curry mit Python versucht
Verwenden Sie die Rückruffunktion in Python
Nichtlineare Funktionsmodellierung in Python
Zeichne die Yin-Funktion in Python
Sofortige Funktion (Lüge) in Python
Unittest und CI in Python
Einführung in Pipe Operator und Funktionszusammensetzung in Python (vorläufig)
Implementieren Sie die Funktion power.prop.test von R in Python
Unterschied zwischen list () und [] in Python
Definition des Funktionsargumenttyps in Python
Unterschied zwischen == und ist in Python
Python-Funktion ①
Inklusive Notation im Argument der Python-Funktion
Authentifizierung mit Tweepy-User-Authentifizierung und Anwendungsauthentifizierung (Python)
Anwendung zum Anzeigen und Durchsuchen lokaler Memos (Tagebuch) in Python
[Python] -Funktion
Schreiben Sie die AWS Lambda-Funktion in Python
Bearbeiten Sie Dateien und Ordner in Python
Messen Sie die Ausführungszeit von Funktionen in Python
Zuweisungen und Änderungen in Python-Objekten
[Einführung in die Udemy Python3 + -Anwendung] 36. Verwendung von In und Not
Überprüfen und verschieben Sie das Verzeichnis in Python
Verschlüsselung mit Python: IND-CCA2 und RSA-OAEP
Exportieren und Ausgeben von Dateien in Python
[Python] Unterschied zwischen Funktion und Methode
Reverse Flat Pseudonym und Katakana in Python2.7
Lesen und Schreiben von Text in Python
[GUI in Python] PyQt5-Menü und Symbolleiste-
Python-Funktion ②
Erstellen und lesen Sie Messagepacks in Python
[Python] Funktionsargumente * (Stern) und ** (Doppelstern)
[Einführung in die Udemy Python3 + -Anwendung] 49. Funktionszitat und Rückgabewertdeklaration
Funktion zum Öffnen einer Datei in Python3 (Unterschied zwischen open und codecs.open und Geschwindigkeitsvergleich)
Überlappende reguläre Ausdrücke in Python und Java
Unterschied in der Authentizität zwischen Python und JavaScript
Hinweise zur Verwendung von cChardet und python3-chardet in Python 3.3.1.
Module und Pakete in Python sind "Namespaces"
Vermeiden Sie verschachtelte Schleifen in PHP und Python
Unterschiede zwischen Ruby und Python im Umfang
AM-Modulation und Demodulation mit Python Part 2
Unterschied zwischen Anweisungen (Anweisungen) und Ausdrücken (Ausdrücken) in Python
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
Echte Werte und Eigenvektoren: Lineare Algebra in Python <7>
Warteschlangen- und Python-Implementierungsmodul "deque"
Gefaltetes Liniendiagramm und Skalierungslinie in Python
Implementieren Sie den FIR-Filter in Python und C.
Unterschiede zwischen Python- und Java-Syntax
Überprüfen und empfangen Sie die serielle Schnittstelle in Python (Portprüfung)
Nehmen Sie die logische Summe von List in Python (Zip-Funktion)
Suchen und spielen Sie YouTube-Videos mit Python
[Einführung in die Udemy Python3 + -Anwendung] 45. Aufzählungsfunktion
[Einführung in die Udemy Python3 + -Anwendung] 41. Eingabefunktion
Unterschied zwischen Anhängen und + = in der Python-Liste
Unterschied zwischen nicht lokal und global in Python
Schreiben Sie die O_SYNC-Datei in C und Python
Umgang mit "Jahren und Monaten" in Python
[Einführung in die Udemy Python3 + -Anwendung] 46. Zip-Funktion
Lesen und schreiben Sie JSON-Dateien mit Python
Zeichnen Sie Daten einfach in Shell und Python