No comprendí muy bien sobre la función de cabecera en que momento entra o se cumple?
Se cumple cuando no especificas los valores por omisión y es mayormente usada en tiempo de compilación.
defmoduleConcatdodefjoin(a, b \\nil, sep \\" ")defjoin(a, b, _sep)whenis_nil(b)do a
enddefjoin(a, b, sep)do a <> sep <> b
endendIO.puts(Concat.join("Hello","world"))IO.puts(Concat.join("Hello","world","_"))IO.puts(Concat.join("Hello"))
Veo que usas Guards, que seria mejor? manejar muchas variantes de la misma función dependiendo los parámetros de entrada, Pattern Matching o Guards?
Tal como lo indica el enlace que colocaste, las guardas son un complemento al pattern marching y nos permiten establecer comprobaciones más complejas. Mi preferencia en un principio se inclina a lo que produzca un código más sucinto y legible tanto para mi como para mi equipo.
En dicho enlace también te indican que haciendo uso exclusivo de pattern matching no puedes escribir la función empty_map?/1, porque el mapa %{} coincide con cualquier mapa, no solo un mapa vacío. Por lo tanto, recurrimos a guardas haciendo:
Por otro lado, uno de los creadores de Erlang, Joe Armstrong, solía decir lo siguiente:
“Make it work, then make it beautiful, then if you really, really have to, make it fast. 90 percent of the time, if you make it beautiful, it will already be fast. So really, just make it beautiful!”
Siempre trato de aplicar dicho consejo, una vez mi código funciona, lo que hago, si es necesario, aplico refactoring para hacerlo más presentable o legible.