Tracks
/
Roc
Roc
/
Ejercicios
/
Operaciones con arrays
Operaciones con arrays

Operaciones con arrays

Intermedia

Instrucciones

Implementa operaciones básicas de arrays.

En los lenguajes funcionales, las operaciones de arrays como length, map y reduce son muy comunes. Implementa una serie de operaciones básicas de arrays, sin usar funciones existentes.

El número exacto y los nombres de las operaciones que debes implementar dependerán del track, para evitar conflictos con nombres existentes, pero las operaciones generales que implementarás incluyen:

  • append (dados dos arrays, agrega todos los elementos del segundo array al final del primero);
  • concatenate (dada una serie de arrays, combina todos los elementos de todos los arrays en un solo array aplanado);
  • filter (dado un predicado y un array, devuelve el array de todos los elementos para los que predicate(item) es True);
  • length (dado un array, devuelve el número total de elementos que contiene);
  • map (dada una función y un array, devuelve el array de los resultados de aplicar function(item) a todos los elementos);
  • foldl (dadas una función, un array y un acumulador inicial, fold (reduce) cada elemento en el acumulador desde la izquierda);
  • foldr (dadas una función, un array y un acumulador inicial, fold (reduce) cada elemento en el acumulador desde la derecha);
  • reverse (dado un array, devuelve un array con todos los elementos originales, pero en orden inverso).

Ten en cuenta que el orden en el que se pasan los argumentos a las funciones fold (foldl, foldr) es importante.

Espera, ¡es imposible!

Implementar estas operaciones de arrays sin usar ninguna función integrada es prácticamente imposible en Roc, porque necesitas una forma de agregar o anteponer elementos a un array. En otros lenguajes podrías usar operadores como : en Haskell o += en Python, pero en Roc tienes que usar las funciones de List.

Así que para este ejercicio se te permite usar List.append (pero evita usar cualquier otra función integrada).

Muchos lenguajes de programación funcional usan listas enlazadas como tipo de colección principal. Es eficiente anteponer un elemento o sacar el primer elemento de una lista enlazada, así que en esos lenguajes implementarías estas operaciones usando List.prepend. En Roc, sin embargo, un List es un array (un bloque contiguo de bytes). Los arrays tienen propiedades distintas de las listas enlazadas, como la capacidad de acceder a los elementos por índice de forma eficiente y de agregar elementos nuevos. Por eso, en Roc usamos List.append con frecuencia y rara vez usamos List.prepend.

Nombres

Roc usa nombres un poco distintos de los que aparecen en las instrucciones generales:

  • concat en lugar de append
  • join en lugar de concatenate
  • len en lugar de length
  • fold en lugar de foldl
  • fold_rev en lugar de foldr

Sin embargo, los siguientes nombres de funciones son estándar en Roc:

  • filter
  • map
  • reverse

Pista

Prueba a usar:

match list {
    [] => ...
    [first, .. as rest] => ...
}

o

match list {
    [] => ...
    [.. as rest, last] => ...
}
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Roc Exercism

¿Todo listo para empezar Operaciones con arrays?

Regístrate en Exercism para aprender y dominar Roc con 126 ejercicios y mentoría humana real, todo gratis.

¡Profundiza en Operaciones con arrays!

Disfruta de una introducción práctica a la recursión, explora las alternativas imperativas y funcionales a Operaciones con arrays, y profundiza en la recursión de cola y las funciones acumuladoras.