Qual è il nome di λx.λf.fx (come il contrario si applica) nel calcolo lambda? La funzione corrispondente ha un nome standard nella programmazione?


15

Qual è il nome di λx.λf.fx nel calcolo lambda?

La funzione corrispondente ha un nome standard nei linguaggi di programmazione funzionale, come Haskell?

Nella programmazione orientata agli oggetti, esiste un nome abituale per un metodo fooche accetta una funzione come argomento, tale da x.foo(f)restituire f(x)?


3
Devi comprare un dizionario.
Robert Harvey,

13
Quale? Dove? Quanto?
Alexey,

4
Non capisco i voti negativi. Mi sembra una domanda perfettamente ragionevole.
Giorgio,

Ho pubblicato una risposta qui sotto ma mi sono reso conto che l'OP stava chiedendo come si chiama questa espressione lambda, quindi ho eliminato = D
Jason,

Il concetto a cui ti riferisci è noto come combinatore, leggi qui se non hai familiarità en.wikipedia.org/wiki/SKI_combinator_calculus anche se non ho familiarità con un noto combinatore della natura a cui ti riferisci, C da BCKW è vicino (è capovolto) ma non è lo stesso en.wikipedia.org/wiki/B,C,K,W_system perché non divertirsi un po 'e inventare la combinazione di quei combinatori che si traduce nella tua funzione :)
Jimmy Hoffa

Risposte:


9

In Haskell, \x.\f.f xè flip ($)che, come $si legge come applico , leggevo come inverso applicare .

Circa basato su /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Questo errore ... capovolgere è \f.\x.\y.f y xcapovolgere qui C. en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa,

anche l'aggiunta $a flip in questo modo si aspetta una funzione parzialmente applicata che prende in carico 2 argomenti in cui capovolgerai solo gli ultimi 2, quindi applichi parzialmente tutti tranne quelli 2
Jimmy Hoffa,

6
Quindi dubiti che si (\f.\x.\y.f y x) (\f.\x.f x)riduca alla (\x.\f.f x)ridenominazione del modulo? Che fa.
Dan D.,

5

Usando i combinatori standard è possibile esprimere questa funzione come

C I

dove

C f x y = (f y) x

In Haskell lo sarebbe

flip id

Qui idil tipo è specializzato (a -> b) -> a -> be flipscambia a -> be a.

Puoi anche esprimerlo nel calcolo SKI :

S (K (S I)) K

+1 per dedurre i combinatori per questo. Davvero non sospetto che sia una cosa molto conosciuta, anche se se identificasse qualcosa correlato ai numeri delle chiese, sono propenso a chiedermi se la CI sia documentata ovunque come rilevante negli studi numerici sulle chiese di nessuno
Jimmy Hoffa,

5

Nell'originale Alonzo Church "The calcoli di lambda-conversione", ha denota questo combinatore da T .

Nel contesto dei numeri della Chiesa, si chiama exp . Ciò corrisponde alla notazione "stenografia" usata da Church per "l'applicazione" di un termine N a un termine M : "[ M N ]" sta per "( NM )".

Non ho ancora sentito parlare di un nome standard per una funzione analoga in programmazione.


3

Questo a volte viene chiamato combinatore di mughetto e in Clojure è chiamato macro thread-first . Il suo uso principale consiste nel consentire di esprimere un calcolo come una serie di calcoli concatenati nell'ordine in cui vengono eseguiti. Ad esempio, prendere un valore x, passarlo a una funzione f, quindi passare i risultati f(x)a una funzione g, sarebbe scritto come g(f(x))usando la composizione di funzioni standard (o g (f x)se stai lavorando con parentesi implicite). Ciò può essere imbarazzante quando c'è un gran numero di funzioni concatenate perché devi leggerle nell'ordine inverso rispetto a come vengono eseguite. Il combinatore del mughetto ti consente di esprimerlo in modo diverso, se definiamo il combinatore del mughetto come:

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

Quindi l'espressione T x f g hdiventa h (g (f x)).

(Per chi è alla ricerca di ulteriori informazioni e di un'implementazione concreta nella lingua Racket, ho un post sul blog sull'argomento: Thrush Combinator in Racket )


2

Spero di capire correttamente la tua domanda, ma credo che questo sia noto come (inverso) Operatore di tubi in lingue ML.

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

C'è anche il Reverse Pipe Operator che aiuta con l'ordine delle operazioni.

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

Questo è utile perché la forma non piped

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

errore perché printf tenta di valutare "The value is.." 2ed errore poiché non esiste un +operatore definito . Per farlo funzionare, usa la parentesi:

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

Per quanto riguarda l'uso pratico, l' |>operatore è incredibilmente utile e il pane e burro di molti linguaggi ispirati alla ML e ML come F #, LiveScript ed Elixir. <|è meno comune e in genere viene utilizzato solo quando aumenta la leggibilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.