2009-12-09 4 views
0

EDIT: Ma question était à l'origine "Y at-il un nom standard pour une fonction qui aplatit une liste de listes, mais seulement un niveau profond?", Mais la réponse de Chuck est beaucoup plus proche de ce que je voulais demander. il. Les trois réponses m'ont été utiles, cependant. Merci. 'Flatten' semble être un nom bien accepté pour une fonction qui prend un arbre et construit une liste d'atomes aussi profonds qu'ils soient imbriqués, mais qu'en est-il d'une fonction qui s'arrête après un seul niveau? Donc ((1 2) ((3 4) (5 6)) (7 8)) "somethings" à (1 2 (3 4) (5 6) 7 8). Est-ce que "quelque chose" a un nom commun dans plusieurs langues/bibliothèques?Existe-t-il un nom commun pour une fonction qui prend une liste de listes et renvoie une seule liste contenant le contenu de ces listes?

Les réponses à cette question:

Flattening a shallow list in Python

suggèrent que « la chaîne » pourrait être une bonne supposition, mais est assez commun d'être « standard »?

Répondre

3

La fonction qui prend une liste de listes et renvoie une liste unique contenant le contenu de ces listes est appelé "concat" dans de nombreux langages fonctionnels (par exemple OCaml, F #, Haskell, Clojure).

2

Je ne suis pas sûr qu'il existe un nom standard pour cela. Je peux nommer 3 implémentations différentes avec 3 noms différents

  • Python: chaîne
  • F #: concat
  • LINQ: SelectMany
5

Pour la suppression d'un ensemble interne de parenthèses d'une liste de listes, concat est très populaire. Une fonction plus générale, pour aplatir un M de M s pour une monade M, est souvent appelée join. En algèbre abstraite, cette fonction est généralement appelée µ.

0

En Common Lisp, vous pouvez appliquer APPEND ou CONCATENATE avec le bon paramètre de type. Le résultat d'APPEND partage la sous-structure avec les listes d'arguments; CONCATENATE copie toujours et peut également être appliqué à des séquences non listées.

+0

Mais les deux ne prennent-ils pas les listes à joindre en tant que paramètres individuels, ne figurant pas dans une seule liste? Je peux donc faire (ajouter (1 2) ((3 4) (5 6)) (7 8)) et revenir (1 2 (3 4) (5 6) 7 8), mais (ajouter ((1 2) ((3 4) (5 6)) (7 8))) reviendrait ((1 2) ((3 4) (5 6)) (7 8)), n'est-ce pas? – jtolle

+0

Oui, mais vous pouvez utiliser un _spreadable argument list_ avec APPLY, ou utiliser REDUCE pour le faire pas à pas. – Svante

+0

Droite. Ce que je demandais, c'est ce qu'un nom commun pourrait être pour une fonction qui fait (appliquer # 'ajouter une liste de listes) ou (réduire #' ajouter une liste de listes). «concat», «join» ou «chain» semblent tous plausibles. – jtolle

Questions connexes