2010-01-24 16 views
7

(Finalmente publiqué y acepté una respuesta al efecto de "no, no la hay, y la pregunta no es en realidad tan general".)¿Existe un nombre típico para una función como 'mapa' que opera en una lista de listas de argumentos en lugar de múltiples listas de argumentos?

Considere la función Lisp común 'mapcar'. Toma una función y algunas listas como argumentos, y llama a la función con argumentos extraídos de la misma posición en cada lista.

¿Las bibliotecas estándar suelen tener una función similar que toma una sola lista, donde cada elemento de la lista es una lista de argumentos para la función? ¿Cómo se llama normalmente una función como "estándar" o no? (Esto no pretende ser una cuestión de Lisp, pero es el único lenguaje funcional + biblioteca que a mitad de camino sé.)

Creo que estoy preguntando si una operación como (en pseudo-Lisp):

(mapcar (curry #'apply function-to-map) list-of-arg-lists) 

ya tiene un nombre que es común en varios idiomas o bibliotecas (de la misma manera que 'map' y 'reduce' son nombres para operaciones comunes, no solo funciones de biblioteca específicas).

Gracias.

+0

Si usted quiere que nosotros denominamos una función para usted ¿Qué hay de dar una definición completa? –

+0

Norman, no estoy pidiendo ayuda para nombrar alguna función aleatoria. Pregunto si una operación en particular ya tiene un nombre común que yo no sé. (Parece similar, pero es claramente diferente de, el único ejemplo de 'mapa' que conozco, pero también parece ser el tipo de cosa que comúnmente se puede hacer.) Mis disculpas si eso parece perezoso o algo, pero entonces Hasta ahora, los comentarios sobre la respuesta de Harold L han sido educativos. Ya aprendí que la pregunta probablemente solo sea significativa en el contexto de los idiomas sin tipo. – jtolle

Respuesta

1

En realidad no hay una "programación funcional" nombre típico para tal operación. De hecho, la forma en que formulo la pregunta presupone un lenguaje que funciona como Lisp, donde las funciones se aplican a las listas de argumentos. También asume que "mapeo" en primer lugar significa hacer algo como el "mapacar" de Lisp.

No todos los idiomas funcionan de esa manera. Por ejemplo, las funciones de Haskell toman solo un argumento tipeado (vea las otras respuestas y comentarios, y http://www.haskell.org/tutorial/index.html). El mapeo de una función que toma un tipo de tupla sobre una lista de ese tipo es conceptualmente similar a la operación que estaba preguntando, y en ese caso la función relevante es ... 'mapa'.

Por lo que respecta a Lisp, así es como funciona la versión 'mapcar' del mapeo de una función sobre argumentos: sube las listas que toma como entradas y aplica la función para mapear a las listas de argumentos resultantes. Algunas otras funciones podrían igualmente tomar las listas de argumentos comprimidos en su lugar y aún llamarse alguna variante de "mapa".

Mi agradecimiento a todos los que contribuyeron a lo que fue, para mí, bastante educativo.

+0

Funciona bastante bien en lenguajes tipados estáticos. Simplemente reemplaza una función variandic con una lista de listas, que es aún más flexible. Ver mi publicación! – Dario

+0

Mi edición hace unos días eliminó la afirmación de que Darío estaba hablando aquí - He dicho que la pregunta no es realmente significativa para "lenguajes funcionales tipados" ... – jtolle

+0

Es un tanto incómodo aceptar mi propia respuesta, pero yo ' Estoy satisfecho de que es el adecuado para la pregunta que hice. – jtolle

3

Propongo map-apply o quizás mapply si solo quiere usarlo usted o en un grupo pequeño.

(defun map-apply (fn arg-lists) 
    (mapcar (lambda (arg-list) (apply fn arg-list)) 
      arg-lists)) 

(map-apply #'+ '((1 2) (3 4 5))) 
    => 
(3 12) 

EDITAR Por supuesto, la suya no es sólo pseudo-Lisp si tiene curry:

(defun curry (f &rest values) 
    (lambda (&rest more-values) 
     (apply f (append values more-values)))) 
+0

Ese es ciertamente un nombre plausible. Espero que alguien que conozca varios idiomas/bibliotecas pueda decirme si hay uno particularmente común. – jtolle

+0

Me parece bien. Esta función es trivial o inútil en un lenguaje funcional tipado, por lo que los principales idiomas que está viendo son dialectos Lisp y Erlang. 'map-apply' me suena como un buen nombre de esquema, aunque me gusta' mapply' porque es inteligente. –

+0

Como dije, realmente no conozco otros lenguajes funcionales, por lo que es interesante que esta realmente * no * sea una pregunta general después de todo. Creo que incluso las utilidades "triviales" pueden ser útiles en cualquier idioma, pero puedo ver cómo este tipo de utilidad no tendría ningún sentido a menos que 'apply' funcione con una lista, y no un conjunto de argumentos que se ajusten a una función específica firma. – jtolle

1

Considere la función Common Lisp 'mapcar'. Toma una función y algunas listas como argumentos, y llama a la función con argumentos extraídos de la misma posición en cada lista.

¿Las bibliotecas estándar suelen tener una función similar que toma una sola lista, donde cada elemento de la lista es una lista de argumentos para la función?

Bueno, Haskell define una serie de zipWithN -Funciones que tienen efectos similares a mapcar para el recuento de argumentos constantes.

zipWith (\a b -> a + b) [1, 2, 3] [1, 2, 3]     => [2, 4, 6] 
zipWith3 (\a b c -> a + b + c) [1, 2, 3] [1, 2, 3] [4, 5, 6] => [6, 9, 12] 

Generalizando este concepto para obtener una lista de listas dará lugar a esta función (implementado ingenuamente) zipWithMany

zipWithMany :: ([a] -> b) -> [[a]] -> [b] 
zipWithMany f lists 
    | any null lists = [] 
    | otherwise  = (f $ map head lists) : zipWithMany f (map tail lists) 

Ejemplo:

zipWithMany sum [[1, 2, 3], [1, 2, 3], [1, 2]] => [3, 6] 
+0

Soy analfabeto de Haskell, pero por su respuesta y un rápido Google, parece que las funciones 'zipWith' funcionan como el 'mapacar' Lisp. Es decir, toman una función y algunas listas, y luego devuelven una lista del resultado de aplicar la función a argumentos extraídos de la misma posición en cada lista. ¿Tengo esa parte, verdad? – jtolle

+0

@jtolle: Sí, lo tienes bien. – Dario

+0

O.K., entonces, ¿cómo funciona el 'mapa' de Haskell cuando tiene una función que toma múltiples argumentos? ¿Puede darle una función que tome múltiples argumentos escritos y una lista de algún tipo de "tupla" donde cada "tupla" contenga el conjunto correcto de argumentos? (Sé que "tupla" tiene un significado real que probablemente estoy matando aquí). ¿O solo espera una función de un solo argumento y una lista de argumentos del tipo correcto, con 'zipWith' cuando se desea mapear? con múltiples argumentos? – jtolle

Cuestiones relacionadas