clojure filtre de la carte par des touches de
Je suis en suivant cet exemple: http://groups.google.com/group/clojure/browse_thread/thread/99b3d792b1d34b56
(voir la dernière réponse)
Et c'est le cryptique d'erreur que je reçois:
Clojure 1.2.1
user=> (def m {:a "x" :b "y" :c "z" :d "w"})
#'user/m
user=> (filter #(some % [:a :b]) m)
java.lang.IllegalArgumentException: Key must be integer
(user=>
Aussi je ne comprends pas pourquoi ce serait même travail. N'est pas (encore ...) retourne la première valeur correspondante, "x", à chaque fois? Je suis un total noob à clojure et juste essayer d'apprendre.
Merci de m'éclairer.
- Le code de la ggroup thread-vous un lien vers résout un problème différent: "étant donné une collection de cartes et un jeu de clés, de retour d'une collection de précisément ceux de la donnée des cartes qui contiennent au moins l'une des touches". Ainsi, dans ce code,
filter
est censé fonctionner sur une collection de cartes, pas une seule carte; et ce#(...)
bloc impliquantsome
est appropriée que si les cartes ne contiennent pas denil
oufalse
valeurs (comme mentionné dans le sujet), mais dans tous les cas, la fonction retourne seront appliquées (paresseusement) pour chacune des cartes à son tour. - ok ça explique mon incompréhension, merci.
Vous devez vous connecter pour publier un commentaire.
Si vous "itérer" sur une carte, vous obtiendrez des paires clé-valeur, plutôt que de touches. Par exemple,
Donc votre fonction anonyme essaie d'évaluer
(some [:a "x"] [:a :b])
qui clairement ne fonctionne pas.La ideomatic solution est d'utiliser
select-keys
comme mentionné dans une autre réponse.Je suppose que j'ai juste besoin de lire les docs plus:
Bien que je ne suis toujours pas sûr de ce que l'intention était avec l'exemple que j'ai trouvé...
Ferait la même chose à l'aide de
filter
etsome
(mais plus laide et la plus lente).Cela fonctionne par le filtre tous de
m
si certains[:a :b]
est dans l'ensemble#{(key x)}
(c'est à dire en utilisant un ensemble en tant que prédicat), puis retourner la carte d'entrée.