Siempre me ha resultado incómodo tener una función o expresión que requiera el uso de los valores, así como los índices, de una lista (o matriz, se aplica igual) en Haskell.Uso de elementos de lista e índices juntos
escribí validQueens
abajo mientras que la experimentación con el problema N-queens here ...
validQueens x =
and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]
no me importa para el uso de la indexación, todos los signos más y sus menos, etc. Se siente descuidado. Se me ocurrió lo siguiente:
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
haber sido inspirado por enumerate
de Python (no es que los préstamos conceptos imperativo es necesariamente una gran idea). Parece mejor en concepto, pero snd
y fst
por todas partes es una mierda. También es, al menos a primera vista, más costoso tanto en tiempo como en espacio. No estoy seguro de si me gusta o no.
Así que en resumen, no estoy realmente satisfecho con cualquiera
- iteración a través por el índice delimitada por longitudes, o peor aún, off-by-unos y dos
- tuplas Índice de elementos
¿Alguien ha encontrado un patrón que le parezca más elegante que cualquiera de los anteriores? Si no, ¿hay alguna razón de peso para que uno de los métodos anteriores sea superior?