Una función transforma valores. Toma un valor y genera otro.
Por ejemplo, aquí hay una función de saludo que toma un nombre y dice hola:
> greet name =
| "Hello " ++ name ++ "!"
|
<function>
> greet "Alice"
"Hello Alice!"
> greet "Bob"
"Hello Bob!"
Los valores pasados a la función se llaman comúnmente argumentos, así que podrías decir "saludar es una función que toma un argumento".
Bien, ahora que ya hablamos de saludos, ¿qué tal una función de madlib que toma dos argumentos?
> madlib animal adjective =
| "The ostentatious " ++ animal ++ " wears " ++ adjective ++ " shorts."
|
<function>
> madlib "cat" "ergonomic"
"The ostentatious cat wears ergonomic shorts."
> madlib ("butter" ++ "fly") "metallic"
"The ostentatious butterfly wears metallic shorts."
Se debe usar paréntesis para agrupar "butter" ++ "fly". Cada argumento debe ser un valor primitivo como "cat" o debe estar entre paréntesis.
Quienes usan lenguajes como JavaScript podrían sorprenderse de que las funciones se vean diferentes aquí:
madlib "cat" "ergonomic" -- Elm
madlib("cat", "ergonomic") // JavaScript
madlib ("butter" ++ "fly") "metallic" -- Elm
madlib("butter" + "fly", "metallic") // JavaScript
Esto puede resultar sorprendente al principio, pero este estilo termina usando menos paréntesis y comas. ¡Hace que el lenguaje se sienta realmente limpio y minimalista una vez que te acostumbras!