2010-08-07 8 views
7

estoy leyendo de Simon Thompson Haskell: El arte de la programación funcional, y me pregunto ¿cómo funciona esto:¿Cómo funciona este Haskell para calcular permutaciones utilizando el trabajo de comprensión de listas?

perms [] = [[]] 
perms xs = [ x:ps | x <- xs , ps <- perms (xs\\[x]) ] 

Me parece que no puede entender cómo se supone que perms(xs\\[x]) para funcionar. El rastro de una lista de dos elementos muestra:

perms [2,3] 
    [ x:ps | x <- [2,3] , ps <- perms ([2,3] \\ [x]) ]  exe.1 
    [ 2:ps | ps <- perms [3] ] ++ [ 3:ps | ps <- perms [2] ] exe.2 
    ... 

¿cómo ir exe.1-exe.2?

+0

¿Por qué el voto a favor? –

+2

¿Sabes qué ?, soy un idiota. Esa fue la primera huella que he visto de la comprensión de la lista. El seguimiento muestra todos los elementos de la lista que se crearán uno a la vez. No sé por qué estaba pensando que la tercera fila abajo era el segundo elemento de la lista que se crearía. –

Respuesta

4

Básicamente dice:

  1. tomar cualquier x de la lista xs (x <- xs)
  2. Take ps que es permutación de la lista xs\\[x] (es decir xs con borrada x) - perms (xs\\[x])
  3. devolver el resultado.

la perms(xs\\[x]) es llamada recursiva que elimina x de xs.

4

Bueno, simplemente inserta 2 y 3 respectivamente en [2,3] \\ [x]. Por lo que tiene

[ 2:ps | ps <- perms ([2,3] \\ [2]) ] ++ [ 3:ps | ps <- perms ([2,3] \\ [3]) ] 

Y puesto \\ es el operador de diferencia, es decir, que devuelve los elementos de la primera lista que no están en la segunda lista, el resultado es [3] y [2] respectivamente.

Cuestiones relacionadas