Super buenos consejos para escribir código Elixir más manejable.
Las funciones con side-effects suelen devolver resultados tipo
{:ok, term()} | {:error, term()}
. Si estás trabajando con funciones que tienen side-effects, no las conectes con la siguiente función con un pipe. Es mejor tratar los resultados con uncase
o con unwith
.
Super de acuerdo en esto. Recuerdo que hace no demasiado me pareció «superapropiado» hacer un fmap
monádico en Elixir para poder escribir luego código fancy a lo Haskell:
# Just don't. Not a very smart idea despite what it looks like
def fmap({:ok, x}, f), do: {:ok, f.(x)}
def fmap(whatever, _), do: whatever
def readline(path),
do:
File.read(path)
|> fmap(&String.split(&1, "\n"))
|> fmap(&Enum.filter(&1, fn line -> line != "" end))
Pero desde que conozco el with
, no sólo no me parece necesario sino que oh dios mío por qué pude pensar que esto era buena idea. En caso de que deje de cumplirse con la secuencia de condiciones, with
evalúa el bloque completo al valor devuelto por la primera función que salió mal, dejandolo todo más limpio.
def readline(path),
do:
with {:ok, contents} <- File.read(path),
{:ok, lines} <- String.split(contents, "\n"),
{:ok, trimmed} <- Enum.filter(lines, fn line -> line != "" end) do
trimmed
end
Supongo que no será la única epifanía ocurrida en este mundo al conocer la palabra clave with
.