Tema

Práctica 2 - Ejercicio 6

7 respuestas 8646 visitas

Escriba la función auxiliar concat que dada una lista de listas de enteros forme la lista que representa la concatenación de todas ls listas que conforman la primera. (En el Ejercicio 3 se defune concat(x : [[T]]) : [T] como análoga a la función conc pero concatena varias listas).

yo pensé esto:

\(aux\) \(concat\) \((a:[\mathbb{Z}]]) : [\mathbb{Z}] = [conc (a_i) | 0 \leqslant i < |a|];\)

Está bien?
Gracias, 🙂

Yo no sé si se puede hacer como lo hiciste vos.

Yo lo pensé así:

$$aux\; concat (li : [[\mathbb{Z}]]) : [\mathbb{Z}] = [ x \vert sublista \leftarrow li, x \leftarrow sublista]$$

¿El tuyo funciona? Me gustaría saber, porque la verdad no lo entiendo bien.

El de Gisela me parece que no tipa. El tuyo tampoco está del todo bien, porque cuando concatenás listas, los elementos de las listas deberían quedar en el mismo orden: [[1,2,3],[4,5,6],[7,8,9]] = [1,2,3,4,5,6,7,8,9]. En este caso, no estás indicando en qué orden tienen que ir los elementos. Vas a necesitar recorrer las posiciones de la lista, en lugar de los elementos.

Si asumís que tu función concat, "concatena" listas en cualquier orden estaría bien entones, pero creo que no es la idea del ejercicio.

Ah, yo creía que los selectores iban en orden. Así:

Tomo el primer elemento del primer selector, y recorro todo el segundo selector en orden. Después tomo el segundo elemento del primer selector y recorro el segundo selector en orden. Y así sucesivamente.

Fijate en la filmina 19 del teórico 3. Creo que están diciendo esto que yo digo sobre el orden.

Está bien, los selectores van tomando los elementos en orden. Entonces está bien!

Joya.

El de Gisela, revisándolo de nuevo, me parece que está mal.

Porque conc toma dos parámetros, es así:

conc(a, b: [T]): [T]

Y ahí ella está pasándole sólo un parámetro \(a_{i}\).

Si, el mío es un desastre, jaja, me di cuenta después. A ver si ahí queda mejor:

$$aux \hspace*{0.1cm} concat (a:[[\mathbb{Z}]]) : [\mathbb{Z}] = [conc (a_i,a_j) | i,j \leftarrow [0..|a|), i \leq j]$$

Aunque me quedan ciertas dudas de que esté bien armada la lista por comprensión...

Fijate qué devuelve eso, por eiemplo con la lista \([[1],[2],[3]]\)

$$aux concat([[1],[2],[3]]) = [concat([1],[1]), concat([1],[2]), concat([1],[3]), concat([2],[2]), concat([2],[3]), concat([3],[3])] = [[1,1],[1,2],[1,3],[2,2],[2,3],[3,3]]$$

Cuando lo que queremos es: \([1,2,3]\)

Quedó otra lista de listas, cuando vos aseguraste que el resultado iba a ser una lista de enteros! eso no tipa... aparentemente si querés usar \(concat\), no te va a convenir usar una lista por comprensión.

Supongo que estás pensando en algo así como \(= concat([1],concat([2],[3])) = concat([1],[2,3]) = [1,2,3]\)