2010-01-24 6 views
7

(ho finalmente inviato e accettato una risposta all'effetto "no, non c'è, e la domanda non è in realtà quella generale".)Esiste un nome tipico per una funzione come "map" che opera su un elenco di elenchi di argomenti anziché su più elenchi di argomenti?

Considerare la funzione Common map Lisp 'mapcar'. Prende una funzione e alcune liste come argomenti, e chiama la funzione con argomenti estratti dalla stessa posizione in ogni lista.

Le librerie standard hanno in genere una funzione simile che accetta un singolo elenco, in cui ogni elemento dell'elenco è un elenco di argomenti per la funzione? Che cosa è una funzione come quella che si chiama in genere "standard" o no? (Questo non vuole essere una domanda Lisp, ma è l'unico linguaggio funzionale + libreria che metà so.)

Credo che sto chiedendo se un'operazione come (in pseudo-Lisp):

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

ha già un nome comune in più lingue o librerie (nello stesso modo in cui 'mappa' e 'reduce' sono nomi per operazioni comuni, non solo funzioni di libreria specifiche).

Grazie.

+0

Se si desidera che noi per citarne una funzione per voi , che ne dici di dare una definizione completa? –

+0

Norman, non sto chiedendo aiuto per nominare alcune funzioni casuali. Sto chiedendo se una particolare operazione ha già un nome comune di cui non so nulla. (Sembra simile a, ma è chiaramente diverso da, l'unico esempio di 'mappa' che conosco, ma sembra anche il tipo di cosa che potrebbe essere comunemente fatto.) Le mie scuse se questo sembra pigro o qualcosa del genere, ma così i commenti sulla risposta di Harold L'sono stati educativi. Ho già imparato che la domanda è probabilmente solo significativa nel contesto dei linguaggi non tipizzati. – jtolle

risposta

1

Non c'è davvero un tipico "programmazione funzionale" nome per la suddetta operazione specifica. In effetti, il modo in cui ho formulato la domanda presuppone un linguaggio che funzioni come Lisp, in cui le funzioni vengono applicate agli elenchi di argomenti. Assume anche che la "mappatura" in primo luogo significhi fare qualcosa come la "mappa" di Lisp.

Non tutte le lingue funzionano in questo modo. Ad esempio, le funzioni Haskell accettano solo un argomento tipizzato (vedere le altre risposte e i commenti e http://www.haskell.org/tutorial/index.html). Mappare una funzione che prende un tipo di tupla su un elenco di quel tipo è concettualmente simile all'operazione che stavo chiedendo, e in quel caso la funzione rilevante è ... 'mappa'.

Per quanto riguarda il Lisp è interessato, questo è solo il modo in cui la versione 'mapcar' di mappare una funzione più di argomenti funziona - zip gli elenchi che prende come input e applica la funzione per mappare le liste di argomenti che ne derivano. Alcune altre funzioni potrebbero invece prendere facilmente gli elenchi degli argomenti compressi e comunque essere chiamate alcune varianti di "mappa".

Grazie a tutti coloro che hanno contribuito a quello che per me è stato educativo.

+0

Funziona piuttosto bene in lingue tipizzate staticamente. Basta sostituire una funzione variandic con una lista di liste, che è ancora più flessibile. Guarda il mio post! – Dario

+0

La mia modifica qualche giorno fa ha rimosso la frase che Dario stava parlando qui - Ho detto che la domanda non è davvero significativa per "linguaggi funzionali digitati" ... – jtolle

+0

È una specie di imbarazzo accettare la mia risposta, ma io " Sono soddisfatto che sia quello giusto per la domanda che ho posto. – jtolle

3

Nominare map-apply o forse mapply se si desidera utilizzarlo da soli o in un piccolo gruppo.

(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) 

EDIT Naturalmente il vostro non è solo pseudo-Lisp se avete curry:

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

Questo è certamente un nome plausibile. Spero che qualcuno che conosce più lingue/biblioteche possa dirmi se ce n'è uno particolarmente comune. – jtolle

+0

Mi sembra buono. Questa funzione è banale o inutile in un linguaggio funzionale tipizzato, quindi le lingue principali che stai guardando sono i dialetti Lisp e Erlang. 'map-apply' suona come un buon nome Scheme, anche se mi piace' mapply' perché è intelligente. –

+0

Come ho già detto, in realtà non conosco altri linguaggi funzionali, quindi è interessante che questa * non * sia una domanda generale dopo tutto. Penso che anche le utility "banali" possano essere utili in qualsiasi linguaggio, ma posso vedere come questo tipo di utilità non avrebbe senso a meno che "apply" funzioni con una lista, e non un insieme di argomenti che si conformano a una funzione specifica firma. – jtolle

1

Si consideri la funzione Common Lisp 'mapcar'. Prende una funzione e alcune liste come argomenti, e chiama la funzione con argomenti estratti dalla stessa posizione in ogni lista.

Le librerie standard hanno in genere una funzione simile che accetta un singolo elenco, in cui ogni elemento dell'elenco è un elenco di argomenti per la funzione?

Beh, Haskell definisce una serie di zipWithN -Funzioni che hanno effetti simili a mapcar per il conteggio degli argomenti costanti.

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] 

Generalizzando questo concetto per una lista di liste si tradurrà in questa funzione (ingenuamente implementata) zipWithMany

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

Esempio:

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

Sono Haskell-analfabeta, ma dalla tua risposta e un rapido Google, sembra che le funzioni 'zipWith' funzionino come la 'mappa' Lisp. Cioè, prendono una funzione e alcuni elenchi e quindi restituiscono una lista del risultato dell'applicazione della funzione agli argomenti tratti dalla stessa posizione in ogni lista. Ho questa parte giusta? – jtolle

+0

@jtolle: Sì, hai capito bene. – Dario

+0

O.K., quindi, come funziona la 'mappa' Haskell quando si ha una funzione che richiede più argomenti? Puoi dargli una funzione che prende più argomenti tipizzati e un elenco di un tipo di tipo "tupla" in cui ogni "tupla" contiene il giusto insieme di argomenti? (So ​​che "tuple" ha un significato reale che probabilmente sto macellando qui.) O si aspetta solo una funzione di un singolo argomento e un elenco di argomenti del tipo giusto, con "zipWith" fornito quando si desidera mappare con più argomenti? – jtolle

Problemi correlati