Synthèse de fonctions et application en Python

Recommandation de synthèse de fonctions - Introduction au langage fonctionnel dédié aux programmeurs orientés objet Partie 1

Recommandation d'application de la fonction - Introduction au langage fonctionnel dédié aux programmeurs orientés objet Partie 2

J'ai trouvé un article comme celui ci-dessus, alors j'ai pensé que j'aimerais aussi le faire en Python ^ ~ ~, alors j'ai essayé un peu.

Tout d'abord, à partir de la mise en œuvre de la fonction de synthèse de fonction (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))

J'ai essayé de mettre quelque chose comme un commentaire de type, mais on ne sait pas s'il est plus facile à lire.

Au fait, la composition de la fonction est faite ci-dessus, mais les parenthèses sont pleines. Scala Je ne suis pas sûr, mais l'article original semble utiliser des opérateurs et des conversions de type implicites pour se débarrasser des parenthèses. Scala a peur

Cependant, Python ne peut pas définir l'opérateur oleore en premier lieu. Donc, ici nous allons travailler sur la neutralisation de la fonction. Tout le monde aime __ror__, la surcharge __or__ et réécrire la composition.

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))

Eh bien, avec ça


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

Vous pouvez maintenant écrire comme ça.

Enfin, implémentons un conteneur appelé Ap qui apparaît dans la partie 2 de l'article d'origine. Utilisez l'opérateur de décalage de bits droit pour prendre la fonction et l'utiliser comme il convient.

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

En utilisant ce gars


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

Je peux maintenant écrire. Je l'ai fait.

Il reste encore des crochets, mais vous pouvez terminer. J'aime ça parce que c'est intéressant, mais je ne pense pas que ce soit pratique parce que je ne pense pas que ça ressemble à Python.

# Addendum

Implémentation de la classe Ap


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

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

Si tu fais


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

C'est comme ça. Il s'agit d'un visuel plus proche de l'article original, et cela donne un sentiment plus appliqué (?)

Post-scriptum:

Bien qu'il soit moins polyvalent, j'ai également écrit quelque chose qui a une atmosphère de Haskell qui permet la composition de fonctions avec .

[Opérateur de composition de Haskell. En Python ~ Implémentation du traitement de collection par composition de fonction](https://hachibeechan.hateblo.jp/entry/implements-the-haskells-compose-function-in-python-and-list- En traitement)

Recommended Posts

Synthèse de fonctions et application en Python
J'ai essayé la synthèse de fonctions et le curry avec python
Utiliser la fonction de rappel en Python
Modélisation de fonctions non linéaires en Python
Dessiner la fonction Yin en python
Fonction immédiate (lie) en python
Unittest et CI en Python
Introduire l'opérateur pipe et la composition de fonction à Python (provisoire)
Implémenter la fonction power.prop.test de R en python
Différence entre list () et [] en Python
Définition du type d'argument de fonction en python
Différence entre == et est en python
fonction python ①
Notation inclusive dans l'argument de la fonction Python
Authentification à l'aide de l'authentification des utilisateurs tweepy et de l'authentification d'application (Python)
Application pour afficher et rechercher des mémos locaux (agenda) en Python
[Python] fonction
Ecrire une fonction AWS Lambda en Python
Manipuler des fichiers et des dossiers en Python
Mesurer le temps d'exécution de la fonction en Python
Affectations et modifications des objets Python
[Introduction à l'application Udemy Python3 +] 36. Utilisation de In et Not
Vérifiez et déplacez le répertoire en Python
Chiffrement avec Python: IND-CCA2 et RSA-OAEP
Exporter et exporter des fichiers en Python
[Python] Différence entre fonction et méthode
Inverser le pseudonyme plat et le katakana en Python2.7
Lire et écrire du texte en Python
[GUI en Python] Menu PyQt5 et barre d'outils-
fonction python ②
Créer et lire des paquets de messages en Python
[Python] Arguments de fonction * (étoile) et ** (étoile double)
[Introduction à Udemy Python3 + Application] 49. Citation de fonction et déclaration de valeur de retour
Fonction pour ouvrir un fichier en Python3 (différence entre open et codecs.open et comparaison de vitesse)
Chevauchement d'expressions régulières en Python et Java
Différence d'authenticité entre Python et JavaScript
Notes utilisant cChardet et python3-chardet dans Python 3.3.1.
Les modules et packages en Python sont des "espaces de noms"
Évitez les boucles imbriquées en PHP et Python
Différences entre Ruby et Python dans la portée
Modulation et démodulation AM avec Python Partie 2
différence entre les instructions (instructions) et les expressions (expressions) en Python
Précautions lors du décapage d'une fonction en python
Valeurs authentiques et vecteurs propres: Algèbre linéaire en Python <7>
Module d'implémentation de file d'attente et Python "deque"
Graphique à lignes pliées et ligne d'échelle en python
Implémenter le filtre FIR en langage Python et C
Différences entre la syntaxe Python et Java
Vérifier et recevoir le port série en Python (vérification du port)
Prenez la somme logique de List en Python (fonction zip)
Rechercher et lire des vidéos YouTube avec Python
[Introduction à l'application Udemy Python3 +] 45. fonction enumerate
[Introduction à l'application Udemy Python3 +] 41. fonction d'entrée
Différence entre append et + = dans la liste Python
Différence entre non local et global en Python
Ecrire le fichier O_SYNC en C et Python
Gérer les "années et mois" en Python
[Introduction à l'application Udemy Python3 +] 46. fonction zip
Lire et écrire des fichiers JSON avec Python
Représentez facilement des données graphiques dans le shell et Python