Pregunta

Estaba jugando con algo de programación funcional cuando me encontré con la necesidad de esta función, sin embargo, no sé cómo se llama este tipo de cosas en la nomenclatura estándar. ¿Alguien lo reconoce?

function WhatAmIDoing(args...)
   return function()
       return args
   end
end

Editar: generalizó la función, toma una cantidad variable de argumentos (o tal vez una lista implícita) y devuelve una función que cuando se invoca devuelve todos los argumentos, algo así como un curry o pepinillo, pero tampoco parece serlo.

¿Fue útil?

Solución

WhatAmIDoing es una función de orden superior porque es una función que devuelve otra función.

Lo que devuelve es un thunk , un cierre creado para la computación retrasada del valor actual. Por lo general, los thunks se crean para evaluar perezosamente una expresión (y posiblemente memorizarla), pero en otros casos, simplemente se necesita una función en lugar de un valor simple, como en el caso de '' constantemente 5 " ;, que en algunos idiomas devuelve una función que siempre devuelve 5.

Esto último podría aplicarse en el ejemplo dado, porque suponiendo que el lenguaje evalúa en orden aplicativo (es decir, evalúa los argumentos antes de llamar a una función), la función no tiene otro propósito que convertir los valores en una función que los devuelve.

WhatAmIDoing es realmente una implementación de " constantemente " función que estaba describiendo. Pero en general, no tiene que devolver solo args en la función interna. Puede devolver " ackermann (args) " ;, lo que podría llevar mucho tiempo, como en ...

function WhatAmIDoing2(args...)
   return function()
       return ackermann(args)
   end
end

Pero WhatAmIDoing2 volvería inmediatamente porque la evaluación de la función ackermann se suspendería en un cierre . (Sí, incluso en un lenguaje de llamada por valor).

Otros consejos

En la programación funcional, una función que toma otra función como argumento o devuelve otra función se llama higher- función de orden .

Diría que XXXX devuelve un cierre de la función sin nombre vinculada a los valores de x, y y z.

Este wikipedia puede arrojar algo de luz

Currying se trata de transformar una función en una cadena de funciones, cada una de las cuales solo toma un parámetro y devolviendo otra de esas funciones. Entonces, este ejemplo no tiene relación con el curry.

Pickling es un término utilizado habitualmente para denotar algún tipo de serialización. Tal vez para almacenar un objeto construido a partir de múltiples valores.

Si el aspecto interesante para usted es que la función devuelta puede acceder a los argumentos de la función XXXX, entonces iría con Remo.D.

Como han dicho otros, es una función de orden superior . Como tienes " patrón " En su pregunta, pensé agregar que esta característica de los lenguajes funcionales a menudo se modela utilizando el patrón de estrategia en idiomas sin funciones de orden superior.

Algo muy similar se llama constantemente en Clojure:

http://gith /richhickey/clojure/blob/ab6fc90d56bfb3b969ed84058e1b3a4b30faa400/src/clj/clojure/core.clj#L1096

Solo la función que constantemente devuelve toma una cantidad arbitraria de argumentos, por lo que es más general (y flexible) que su patrón.

No sé si este patrón tiene un nombre, pero lo usaría en casos en los que normalmente se esperan funciones, pero lo único que me importa es que se devuelva un cierto valor:

(map (constantly 9) [1 2 3])
=> (9 9 9) 

Me pregunto, ¿para qué usas esto?

¿Un delegado?

Básicamente, ¿está devolviendo una función? o la salida de una función?

No entendí, lo siento ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top