Elixir, aunque no tiene una implementación nativa de mónadas como Haskell, permite patrones funcionales que se pueden potenciar con bibliotecas como Monadex. Monadex nos brinda las clásicas Maybe y Either, permitiéndonos manejar valores opcionales y errores de forma compositiva, y aprovechando el poder de la programación funcional.
Primero, agrega Monadex a tu archivo mix.exs:
defp deps do
[
{:monadex, "~> 1.1"}
]
end
Ejecuta mix deps.get para instalar la dependencia.
La mónada Maybe es útil cuando deseas trabajar con valores que podrían ser nil. Monadex provee funciones para encapsular operaciones en un flujo que se detiene automáticamente si algún valor es nil.
Supongamos que estamos buscando datos de un usuario y aplicando transformaciones a su información.
alias Monadex.Maybe
def get_user_info(user) do
Maybe.return(user)
|> Maybe.and_then(&get_name/1)
|> Maybe.and_then(&upcase_name/1)
end
defp get_name(%{name: name}), do: Maybe.return(name)
defp get_name(_), do: Maybe.nothing()
defp upcase_name(name), do: Maybe.return(String.upcase(name))
user = %{name: "Juan"}
get_user_info(user) # Retorna: {:ok, "JUAN"}
Either es útil para operaciones que pueden tener éxito o devolver un error. Similar a Maybe, Either permite encadenar operaciones pero distingue entre :ok y :error.
Procesemos datos que pueden fallar en algún paso.
alias Monadex.Either
def process_data(data) do
Either.return(data)
|> Either.and_then(&validate/1)
|> Either.and_then(&transform/1)
end
defp validate(data) do
if valid?(data), do: Either.ok(data), else: Either.error("Invalid data")
end
defp transform(data), do: Either.ok("Processed: #{data}")
process_data("valid_data") # Retorna: {:ok, "Processed: valid_data"}
process_data("invalid") # Retorna: {:error, "Invalid data"}
Monadex facilita el manejo de errores y valores opcionales en Elixir, siguiendo patrones funcionales.
Dejo link: https://github.com/rob-brown/MonadEx