El siguiente es un pequeño ejercicio encontrado en el curso de Haskell
disponible en la Universidad de Helsinki.
Desafío
Dado una lista de nombres y apellidos:
- Nombres:
["Eva", "Mike"]
- Apellidos:
["Smith", "Wood", "Odd"]
Retornar una lista cuyos elementos sean solo de personas con largo par.
Ejemplo de Retorno
["EvaSmith", "EvaOdd", "MikeWood"]
Solución en Haskell
Haskell permite pattern matching y list comprehensions
.
[whole | first <- ["Eva", "Mike"],
last <- ["Smith", "Wood", "Odd"],
let whole = first ++ last,
even (length whole)]
Solución en Elixir
Si bien la solución en Elixir no es tan corta como en Haskell
es igual de elegante.
require Integer
for first <- ~w[Eva Mike],
last <- ~w[Smith Wood Odd],
name <- [first <> last],
name
|> String.length()
|> Integer.is_even(), do: name
Para esto utilizamos las características de for comprehensions
.
Solución en Javascript
David de Javascript Chile nos escribe una solución en versión
imperativa y declarativa utilizando Javascript.
Imperativa
const nombres = ["Eva", "Mike"];
const apellidos = ["Smith", "Wood", "Odd"];
const output = [];
for(let i = 0; i < nombres.length; i++){
for(let j = 0; j < apellidos.length; j++){
const fullName = `${nombres[i]}${apellidos[j]}`;
if(fullName.length % 2 == 0){
output.push(fullName);
}
}
}
Declarativa
const nombres = ["Eva", "Mike"];
const apellidos = ["Smith", "Wood", "Odd"];
const output = nombres.flatMap(n =>
apellidos.map(a => `${n}${a}`)
)
.filter(fullName => fullName.length % 2 == 0);
Elixir
La versión declarativa de Javascript la podríamos emular en Elixir de la siguiente
forma:
~w[Eva Mike]
|> Enum.flat_map(fn first ->
~w[Smith Wood Odd]
|> Enum.map(fn last ->
first <> last
end)
end)
|> Enum.filter(&
&1
|> String.length()
|> Integer.is_even()
)
Aunque no es tan elegante como usar for comprehensions
.
¿En qué otros lenguajes puedes solucionar el desafío?
Top comments (1)
The Erlang version will probably be very similar to the Haskell version.