Quel est le nom de λx.λf.fx (comme l'inverse s'applique) dans le calcul lambda? La fonction correspondante a-t-elle un nom standard en programmation?


15

Quel est le nom de λx.λf.fx dans le calcul lambda?

La fonction correspondante a-t-elle un nom standard dans les langages de programmation fonctionnels, comme Haskell?

Dans la programmation orientée objet, existe-t-il un nom habituel pour une méthode fooqui prend une fonction en argument, telle qu'elle x.foo(f)retourne f(x)?


3
Vous devez acheter un dictionnaire.
Robert Harvey

13
Laquelle? Où? Combien?
Alexey

4
Je ne comprends pas les downvotes. Cela me semble une question parfaitement raisonnable.
Giorgio

J'ai posté une réponse ci-dessous mais j'ai réalisé que l'OP demandait quel est le nom de cette expression lambda alors j'ai supprimé = D
Jason

Le concept auquel vous faites référence est connu sous le nom de combinateur, lisez-le ici si vous n'êtes pas familier en.wikipedia.org/wiki/SKI_combinator_calculus bien que je ne sois pas familier avec un combinateur connu de la nature à laquelle vous faites référence cependant, C de BCKW est proche (c'est flip) mais pas le même fr.wikipedia.org/wiki/B,C,K,W_system pourquoi ne pas vous amuser et trouver la combinaison de ces combinateurs qui aboutit à votre fonction :)
Jimmy Hoffa

Réponses:


9

Dans Haskell, \x.\f.f xc'est flip ($)ce qui $est lu tel qu'appliqué , je dirais inversement .

Basé en gros sur /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Ce mauvais ... flip est \f.\x.\y.f y xflip est C ici en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

ajouter également $à flip comme celui-ci attend une fonction partiellement appliquée qui prend en charge 2 arguments où vous allez uniquement retourner les 2 derniers afin que vous appliquiez partiellement tous sauf ceux-ci
Jimmy Hoffa

6
Vous doutez donc que cela se (\f.\x.\y.f y x) (\f.\x.f x)résume à un (\x.\f.f x)renommage modulo? Ce qu'il fait.
Dan D.19

5

En utilisant les combinateurs standard, vous pouvez exprimer cette fonction comme

C I

C f x y = (f y) x

À Haskell, ce serait

flip id

Voici idle type est spécialisé dans (a -> b) -> a -> bet flipswaps a -> bet a.

Vous pouvez également l'exprimer dans le calcul SKI :

S (K (S I)) K

+1 pour en déduire les combinateurs. Je ne pense vraiment pas que ce soit une chose bien connue, mais si comme il l'a identifié, c'est quelque chose lié aux chiffres de l'église, je suis enclin à me demander si l'IC est documenté n'importe où comme pertinent dans les études de chiffres de l'église
Jimmy Hoffa

5

Dans l'original « La lithiase de lambda-conversion » de l' Église Alonzo, il désigne ce combinateur par T .

Dans le contexte des chiffres de l'Église, cela s'appelle exp . Cela correspond à la notation "sténographique" utilisée par Church pour "l'application" d'un terme N à un terme M : "[ M N ]" signifie "( NM )".

Je n'ai pas encore entendu de nom standard pour une fonction analogue en programmation.


3

Ceci est parfois appelé le combinateur de muguet , et dans Clojure, il est appelé la macro thread-first . Son utilisation principale consiste à vous permettre d'exprimer un calcul sous la forme d'une série de calculs chaînés dans l'ordre dans lequel ils s'exécutent. Par exemple, prendre une valeur x, la passer à une fonction f, puis transmettre les résultats de f(x)à une fonction g, serait écrit comme g(f(x))en utilisant la composition de fonctions standard (ou g (f x)si vous travaillez avec des parenthèses implicites.) Cela peut être gênant quand il y a un grand nombre de fonctions chaînées car vous devez les lire dans l'ordre inverse de leur exécution. Le combinateur de muguet vous permet d'exprimer cela différemment, si nous définissons le combinateur de muguet comme:

T x f = f x
T x f g ... = T (T x f) g ...

Puis l'expression T x f g hdevient h (g (f x)).

(Pour ceux qui recherchent plus d'informations ainsi qu'une implémentation concrète dans la langue Racket, j'ai un article de blog sur le sujet: Thrush Combinator in Racket )


2

J'espère avoir bien compris votre question, mais je pense que c'est ce que l'on appelle l'opérateur de tuyau (inversé) dans les langues ML.

[1; 2; 3] |> List.map sq // let it = [1; 4; 9]

Il y a aussi le Reverse Pipe Operator qui aide à l'ordre des opérations.

printf "The value is.." <| 2 + 3 // let it = "The value is..5"

Ceci est utile car le formulaire non pipé

printf "The value is.." 2 + 3 ;; error

serait une erreur car printf essaierait d'évaluer "The value is.." 2et une erreur car il n'y a pas d' +opérateur défini . Pour que cela fonctionne, utilisez des parenthèses:

printf "The value is.." (2 + 3) // let it = "The value is..5"

En ce qui concerne l'utilisation pratique, l' |>opérateur est incroyablement utile et le pain et le beurre de nombreux langages ML et ML-inspirés tels que F #, LiveScript et Elixir. <|est moins courant et généralement utilisé uniquement lorsqu'il augmente la lisibilité.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.