Implementa operaciones básicas con listas.
En los lenguajes funcionales, las operaciones con listas como length, map y reduce son muy habituales. Implementa una serie de operaciones básicas con listas, sin usar las funciones que ya existen.
El número y los nombres exactos de las operaciones que hay que implementar dependerán de cada track, para evitar conflictos con nombres ya existentes, pero las operaciones generales que vas a implementar son:
append (dadas dos listas, añade todos los elementos de la segunda lista al final de la primera);concatenate (dada una serie de listas, combina todos los elementos de todas las listas en una sola lista aplanada);filter (dados un predicado y una lista, devuelve la lista de todos los elementos para los que predicate(item) es True);length (dada una lista, devuelve el número total de elementos que contiene);map (dadas una función y una lista, devuelve la lista de los resultados de aplicar function(item) a todos los elementos);foldl (dadas una función, una lista y un acumulador inicial, pliega (reduce) cada elemento dentro del acumulador desde la izquierda);foldr (dadas una función, una lista y un acumulador inicial, pliega (reduce) cada elemento dentro del acumulador desde la derecha);reverse (dada una lista, devuelve una lista 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 de plegado (foldl, foldr) es significativo.
Implementar estas operaciones con arrays sin usar ninguna función integrada es prácticamente imposible en Roc, porque necesitas una forma de añadir 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, puedes 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.
Anteponer un elemento o extraer el primero de una lista enlazada es eficiente, así que en esos lenguajes implementarías las operaciones con arrays usando List.prepend.
En Roc, sin embargo, un List es un array (un fragmento contiguo de bytes).
Los arrays tienen propiedades distintas de las listas enlazadas, como la capacidad de acceder eficientemente a los elementos por índice y de añadir elementos nuevos.
Por eso, en Roc usamos List.append a menudo y rara vez usamos List.prepend.
Roc usa nombres ligeramente 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 función son estándar en Roc:
filtermapreversePrueba a usar:
match list {
[] => ...
[first, .. as rest] => ...
}
o
match list {
[] => ...
[.. as rest, last] => ...
}
Regístrate en Exercism para aprender y dominar Roc con 126 ejercicios y mentoría humana real, todo gratis.
Disfruta de una introducción práctica a la recursión, explora las alternativas imperativas y funcionales a Operaciones con arrays y sumérgete en la recursión de cola y las funciones acumuladoras.