Utilizando elementos de lista e índices juntos

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.

EscribívalidQueens a continuación mientras experimenta con el problema de N-reinasaquí ...

validQueens x = 
     and [abs (x!!i - x!!j) /= j-i | i<-[0..length x - 2], j<-[i+1..length x - 1]]

No me importaba el uso de indexación, todas las ventajas y desventajas, 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 

star inspirado en el @ de Pythenumerate (no es que tomar prestados conceptos imperativos sea necesariamente una gran idea). Parece mejor en concepto, perosnd yfst todo el lugar un poco apesta. También es, al menos a primera vista, más costoso tanto en tiempo como en espacio. No estoy seguro de si me gusta más o no.

n resumen, no estoy satisfecho con ninguno de los do

Interando a través del índice delimitado por longitudes, o peor aún, fuera de uno y dos Tuplas de elementos de índice

¿Alguien ha encontrado un patrón que les parezca más elegante que cualquiera de los anteriores? Si no, ¿hay alguna razón convincente para que uno de los métodos anteriores sea superior?

Respuestas a la pregunta(2)

Su respuesta a la pregunta