J'ai toujours trouvé gênant d'avoir une fonction ou une expression qui nécessite l'utilisation des valeurs, ainsi que des indices, d'une liste (ou d'un tableau, cela revient au même) en Haskell.
J'ai écrit validQueens
ci-dessous en expérimentant avec le problème des N-queens. aquí ...
validQueens x =
and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
Je n'ai pas aimé l'utilisation de l'indexation, tous les avantages et les inconvénients, etc. C'est un peu négligé. Je suis arrivé à ce qui suit :
enumerate x = zip [0..length x - 1] x
validQueens' :: [Int] -> Bool
validQueens' x = and [abs (snd j - snd i) /= fst j - fst i | i<-l, j<-l, fst j > fst i]
where l = enumerate x
en s'inspirant de Python enumerate
(non pas que l'emprunt de concepts impératifs soit nécessairement une bonne idée). Le concept semble meilleur, mais snd
et fst
partout, ça craint. C'est aussi, du moins à première vue, plus coûteux en temps et en espace. Je ne sais pas si je l'aime mieux ou non.
Donc, en résumé, je ne suis pas vraiment satisfait de l'un ou l'autre des éléments suivants
- Itération à travers un index limité par des longueurs, ou pire, par des nombres entiers et des nombres doubles.
- Tuples d'éléments d'index
Quelqu'un a-t-il trouvé un modèle qu'il trouve plus élégant que l'un ou l'autre des modèles ci-dessus ? Sinon, y a-t-il une raison impérieuse pour laquelle l'une des méthodes ci-dessus est supérieure ?