2011-08-11 1 views
2

Existe-t-il une meilleure façon de faire cela dans Clojure?Carte pour accepter le singulier ou la collection

(if (coll? coll) 
    (map my-fn coll) 
    (my-fn coll) 

doit être appliqué à l'entrée coll. coll peut être soit au singulier ou une collection.

Si je ne vérifie pas pour coll?, en utilisant map seul jetterait une exception IllegalArgumentException pour ne pas savoir comment créer un ISeq de xxx.

Répondre

4

Votre code est correct (bien que je renommerais la variable coll car vous ne savez pas si c'est une collection et cela pourrait dérouter les lecteurs).

Cependant, je suggère que tout ce morceau de code ressemble étrangement à une odeur de code - il faut un peu trop dactylographier dynamique/essayant d'être un peu trop intelligent à mon avis: dans le sens de "cleverness considered harmful".

idées alternatives à considérer:

  • Si vous voulez vraiment traiter tout comme une collection, puis enveloppez les valeurs d'entrée singulières quand ils sont d'abord obtenus dans une liste/vecteur de longueur 1. Ensuite, le reste de votre le code peut sans risque assumer des collections partout.
  • Écrire des fonctions distinctes pour gérer les collections et les valeurs uniques. Le raisonnement est qu'ils sont conceptuellement différents types de données, donc méritent un traitement différent.
1

Si coll ne contient pas de séquences imbriquées:

(map my-fn (flatten (list coll))) 
1

Aucune solution générale ne peut exister, car peut être une fonction qui prend des listes et renvoie les listes. Ensuite, vous ne pouvez pas inspecter l'entrée et décider si vous souhaitez la mapper ou non. Il est préférable de ne pas vous mettre dans le scénario où vous ne savez pas quel type de données vous avez, mais je ne peux pas donner de conseils spécifiques à ce sujet sans en savoir plus sur votre programme.

+0

il est en fait fait à chaud dans incanter.stats –

Questions connexes