Wie heißt λx.λf.fx (wie umgekehrt) in der Lambda-Rechnung? Hat die entsprechende Funktion einen Standardnamen in der Programmierung?


15

Wie heißt λx.λf.fx im Lambda-Kalkül?

Hat die entsprechende Funktion in funktionalen Programmiersprachen wie Haskell einen Standardnamen?

Gibt es in der objektorientierten Programmierung einen üblichen Namen für eine Methode, foodie eine Funktion als Argument verwendet, so dass sie x.foo(f)zurückgibt f(x)?


3
Sie müssen ein Wörterbuch kaufen.
Robert Harvey

13
Welcher? Wo? Wie viel?
Alexey

4
Ich verstehe die Abstimmungen nicht. Das scheint mir eine vernünftige Frage zu sein.
Giorgio

Ich habe eine Antwort unten gepostet, aber ich habe festgestellt, dass das OP nach dem Namen dieses Lambda-Ausdrucks fragt, also habe ich = D
Jason

Das Konzept Sie sich beziehen als combinator bekannt, haben eine lesen Sie hier , wenn Sie nicht vertraut sind en.wikipedia.org/wiki/SKI_combinator_calculus obwohl ich mit einem bekannten combinator der Natur nicht vertraut bin Ihnen aber, C beziehen sich aus BCKW ist nah dran (es ist Flip), aber nicht dasselbe. En.wikipedia.org/wiki/B,C,K,W_system Warum nicht ein bisschen Spaß haben und die Kombination dieser Kombinatoren finden, die zu Ihrer Funktion führt :)
Jimmy Hoffa

Antworten:


9

In Haskell, \x.\f.f xist flip ($)das als $gelesen wird als anwenden , würde ich als gelesen Reverse gelten .

Basiert grob auf /programming/4090168/ist-die-und-umkehr-des-askell-Operators


Diese falsche ... Flip ist \f.\x.\y.f y xFlip ist C hier de.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

Das Hinzufügen $zum Umblättern auf diese Weise setzt eine teilweise angewendete Funktion voraus, die 2 Argumente übernimmt, wobei Sie nur die letzten 2 umblättern, sodass Sie nur diese 2 teilweise anwenden
Jimmy Hoffa,

6
Sie bezweifeln also, dass sich (\f.\x.\y.f y x) (\f.\x.f x)die (\x.\f.f x)Umbenennung auf Modulo reduziert ? Was es tut.
Dan D.

5

Mit den Standard- Kombinatoren können Sie diese Funktion ausdrücken als

C I

wo

C f x y = (f y) x

In Haskell wäre es so

flip id

Hier ist idTyp auf (a -> b) -> a -> bund flipSwap spezialisiert a -> bund a.

Sie können es auch im SKI-Kalkül ausdrücken :

S (K (S I)) K

+1 für die Ableitung der Kombinatoren dafür. Ich vermute wirklich nicht, dass es eine sehr bekannte Sache ist, aber wenn er herausgefunden hat, dass es sich um etwas handelt, das mit Gemeindezahlen zu tun hat, frage ich mich, ob CI irgendwo als relevant in den Studien zu Gemeindezahlen dokumentiert ist
Jimmy Hoffa,

5

In dem ursprünglichen Alonzo Church „The Kalküle von Lambda-Umwandlung“ bezeichnet er diesen combinator von T .

Im Zusammenhang mit den Ziffern der Kirche heißt es exp . Dies entspricht der von Church für die "Anwendung" eines Begriffs N auf einen Begriff M verwendeten "Kurzschrift" -Notation : "[ M N ]" steht für "( NM )".

Ich habe noch keinen Standardnamen für eine analoge Funktion in der Programmierung gehört.


3

Dies wird manchmal als Thrush Combinator bezeichnet und in Clojure als Thread-First-Makro . Der Hauptzweck besteht darin, Ihnen zu ermöglichen, eine Berechnung als eine Reihe von verketteten Berechnungen in der Reihenfolge auszudrücken, in der sie ausgeführt werden. Wenn Sie beispielsweise einen Wert nehmen x, ihn an eine Funktion übergeben fund dann die Ergebnisse f(x)an eine Funktion übergeben g, wird dies wie folgt geschrieben g(f(x))Verwenden der Standardfunktionszusammensetzung (oder g (f x)wenn Sie mit impliziten Klammern arbeiten). Dies kann umständlich sein, wenn eine große Anzahl verketteter Funktionen vorhanden ist, da Sie diese in umgekehrter Reihenfolge lesen müssen, in der sie ausgeführt werden. Mit dem Drosselkombinator können Sie dies anders ausdrücken, wenn wir den Drosselkombinator wie folgt definieren:

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

Dann wird der Ausdruck T x f g hwird h (g (f x)).

(Für diejenigen, die mehr Informationen sowie eine konkrete Implementierung in der Sprache Racket suchen, habe ich einen Blog-Beitrag zum Thema: Thrush Combinator in Racket )


2

Ich hoffe, dass ich Ihre Frage richtig verstehe, aber ich glaube, dass dies in ML-Sprachen als (umgekehrter) Pipe-Operator bekannt ist.

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

Es gibt auch den Reverse Pipe Operator, der bei der Reihenfolge der Operationen hilft.

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

Dies ist nützlich, weil die Form nicht gepiped

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

würde Fehler machen, weil printf versuchen würde, auszuwerten, "The value is.." 2und Fehler machen, weil es keinen definierten +Operator gibt. Verwenden Sie dazu die Klammern:

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

Für den praktischen Gebrauch ist der |>Bediener unglaublich nützlich und das A und O vieler ML- und ML-inspirierter Sprachen wie F #, LiveScript und Elixir. <|ist seltener und wird normalerweise nur verwendet, wenn die Lesbarkeit erhöht wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.