6

Estaba jugando con una 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?¿Cómo se llama este "patrón" funcional?

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

Editar: generalizar la función, se necesita 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 escabeche, pero se tampoco parece serlo

+0

No creo que lo llamaría un patrón, más que si las declaraciones son un patrón. Un patrón generalmente resuelve un problema específico. Esta es solo una construcción de lenguaje bastante fundamental. Solo tiene una función de orden superior que devuelve un cierre. – jalf

+0

¿Cuál es el contexto? ¿Y de qué cantidad de este código estamos hablando? ¿Es solo que la función interna puede acceder a las variables definidas en el exterior? Eso es solo un cierre. ¿O es que eres capaz de devolver funciones anidadas? Eso es solo una propiedad de las funciones de orden superior. – jalf

Respuesta

10

WhatAmIDoing es higher-order function porque es una función que devuelve otra función.

Lo que se devuelve es un thunk — un cierre creado para el cómputo retrasado del valor real. Por lo general, los thunk 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 "constantly 5", que en algunos idiomas devuelve una función que siempre devuelve 5.

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

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

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

Pero WhatAmIDoing2 podría volver inmediatamente porque la evaluación de la función de Ackermann sería suspendido en un closure. (Sí, incluso en un lenguaje de call-by-value.)

+0

Esto parece ser lo que está pasando, algo así como "toThunk" –

+0

No es realmente un thunk en un lenguaje call-by-value (¿verdad?) Ya que no se retrasaría ningún cálculo. –

-2

¿Un delegado?

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

no entendía, lo siento ...

+0

Esta no es la cosa habitual de C#. La programación funcional es un mundo completamente diferente donde las funciones de retorno de funciones –

+0

Frederick tiene razón, no es lo habitual, pero tampoco sé lo suficiente como para ponerle un nombre a lo que estoy haciendo, aunque me parece útil hacerlo. –

+0

Creo que necesito comenzar a aprender a leer las etiquetas antes de responder ... no sabía que estaba relacionado con la programación funcional ... así que asumí mi idioma. – Ironicnet

4

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

Este artículo wikipedia puede arrojar alguna luz

5

En la programación funcional una función que toma otra función como un argumento o devuelve otra función se denomina higher-order function.

2

Currying se trata de transformar una función en una cadena de funciones, tomando cada una solo un parámetro y devolviendo otra función. Entonces, este ejemplo no tiene relación con currying.

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

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

1

Como han dicho otros, es higher-order function. Como tiene un "patrón" en su pregunta, pensé que agregaría que esta característica de los lenguajes funcionales a menudo se modela utilizando el strategy pattern en idiomas sin funciones de orden superior.

1

Algo muy similar se llama constantly en Clojure:

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

Sólo la función que retorna constantly 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 uso en casos en los que normalmente se espera que las funciones, pero lo único que importa es que para un determinado valor se devuelve:

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

Sólo me preguntaba ¿Para qué usas esto?

+0

Sí, ¿creo que el patrón (micro-patrón?) 'Constantemente' es el nombre correcto para esto. En realidad no tenía ningún propósito, pero cuando estaba creando una biblioteca funcional, como experiencia de aprendizaje, abrí mi camino a la posibilidad de esto y noté que era algo especial y que podría tener un nombre propio –

Cuestiones relacionadas