¿Cuál es el nombre de λx.λf.fx (como aplicación inversa) en cálculo lambda? ¿La función correspondiente tiene un nombre estándar en la programación?


15

¿Cuál es el nombre de λx.λf.fx en el cálculo lambda?

¿La función correspondiente tiene un nombre estándar en lenguajes de programación funcionales, como Haskell?

En la programación orientada a objetos, ¿existe un nombre habitual para un método fooque toma una función como argumento, de modo que x.foo(f)devuelve f(x)?


3
Necesitas comprar un diccionario.
Robert Harvey

13
¿Cúal? ¿Dónde? ¿Cuánto cuesta?
Alexey

44
No entiendo los votos negativos. Me parece una pregunta perfectamente razonable.
Giorgio

He publicado una respuesta a continuación, pero me di cuenta de que el OP estaba preguntando cuál es el nombre de esta expresión lambda, así que eliminé = D
Jason

El concepto al que se refiere se conoce como combinador, lea aquí si no está familiarizado en.wikipedia.org/wiki/SKI_combinator_calculus, aunque no estoy familiarizado con un combinador conocido de la naturaleza a la que se refiere, C de BCKW está cerca (es flip) pero no es lo mismo en.wikipedia.org/wiki/B,C,K,W_system ¿por qué no divertirse y crear la combinación de esos combinadores que dan como resultado su función :)
Jimmy Hoffa

Respuestas:


9

En Haskell, \x.\f.f xes flip ($)que, como $se lee como se aplica , leería como se aplica al revés .

Aproximadamente basado en /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Esto está mal ... flip is \f.\x.\y.f y xflip is C here en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

Además, agregar $a flip así espera una función parcialmente aplicada que se haga cargo de 2 argumentos en los que solo volteará los últimos 2, por lo que aplicará parcialmente todos menos esos 2
Jimmy Hoffa

66
¿Entonces dudas que eso se (\f.\x.\y.f y x) (\f.\x.f x)reduzca al (\x.\f.f x)cambio de nombre del módulo? Lo que hace.
Dan D.

5

Usando los combinadores estándar puede expresar esta función como

C I

dónde

C f x y = (f y) x

En Haskell sería

flip id

Aquí idel tipo se especializa (a -> b) -> a -> by flipcambia a -> by a.

También puede expresarlo en el cálculo de SKI :

S (K (S I)) K

+1 por deducir los combinadores para esto. Realmente no sospecho que sea algo muy conocido, aunque si él identificó que es algo relacionado con los números de la iglesia, me pregunto si CI está documentado en alguna parte como relevante en los estudios de numeración de la iglesia de alguien
Jimmy Hoffa,

5

En el original de Alonso "El cálculos de lambda-conversión" Iglesia, que denota este combinador por T .

En el contexto de los números de la Iglesia, se llama exp . Esto coincide con la notación "abreviada" utilizada por Church para la "aplicación" de un término N a un término M : "[ M N ]" significa "( NM )".

Todavía no he oído hablar de un nombre estándar para una función análoga en la programación.


3

Esto a veces se conoce como el combinador de candidiasis , y en Clojure se llama macro del primer subproceso . Su uso principal es permitirle expresar un cálculo como una serie de cálculos encadenados en el orden en que se ejecutan. Por ejemplo, tomar un valor x, pasarlo a una función fy luego pasar los resultados f(x)a una función g, se escribiría como g(f(x))usando la composición de funciones estándar (o g (f x)si está trabajando con paréntesis implícitos). Esto puede ser incómodo cuando hay una gran cantidad de funciones encadenadas porque tiene que leerlas en el orden inverso de cómo se ejecutan. El combinador de aftas le permite expresar esto de manera diferente, si definimos el combinador de aftas como:

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

Entonces la expresión se T x f g hconvierte h (g (f x)).

(Para aquellos que buscan más información, así como una implementación concreta en el lenguaje Racket, tengo una publicación de blog sobre el tema: Thrush Combinator in Racket )


2

Espero entender su pregunta correctamente, pero creo que esto se conoce como el operador de tubería (inverso) en los idiomas de ML.

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

También existe el operador de tubería inversa que ayuda con el orden de las operaciones.

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

Esto es útil porque la forma no abierta

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

error porque printf intentaría evaluar "The value is.." 2y error porque no hay un +operador definido . Para que eso funcione, use paréntesis:

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

En cuanto al uso práctico, el |>operador es increíblemente útil y la base de muchos lenguajes inspirados en ML y ML como F #, LiveScript y Elixir. <|es menos común y generalmente solo se usa cuando aumenta la legibilidad.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.