haskell - programacion - kebab-case
¿Cuál es tu convención de nombres para las funciones de ayuda? (7)
Estoy de acuerdo con ShreevatsaR, si no haces que el helper funcione en el nivel superior (o peor, lo coloques en la lista de exportación), entonces no importa cuál sea su nombre. Tiendo a llamar a las funciones auxiliares f
y g
.
reverse :: [a] -> [a]
reverse = f []
where
f ys [] = xs
f ys (x:xs) = f (x:ys) xs
Solo uso este esquema de nombres para funciones pequeñas (de lo contrario, no sé a qué se refiere f
). Por otra parte, ¿por qué escribirías grandes funciones?
Sin embargo, si desea exportar su función de ''ayuda'' porque podría ser útil para otros, lo llamaría:
reverseAccumulator
Como la zip
y la zip
zipWith
. Pero yo no llamaría a esas funciones de ''ayuda'', zipWith
es solo una función genérica y zip
es la implementación predeterminada (probablemente la que más se usa).
En la programación funcional, a menudo es importante optimizar cualquier código de "bucle" para que sea recursivo de cola. Los algoritmos recursivos de cola usualmente se dividen entre dos funciones, una que establece el caso base y otra que implementa el ciclo real. Un buen ejemplo (aunque académico) sería la función inversa.
reverse :: [a] -> [a]
reverse = reverse_helper []
reverse_helper :: [a] -> [a] -> [a]
reverse_helper result [] = result
reverse_helper result (x:xs) = reverse_helper (x:result) xs
"reverse_helper" no es realmente un buen nombre descriptivo. Sin embargo, "reverse_recursive_part" es incómodo.
¿Qué convención de nomenclatura utilizarías para funciones auxiliares como esta?
Puede llamar a la función auxiliar todo lo que quiera, y no importará siempre y cuando no ponga la función auxiliar en el espacio de nombres "global". Simplemente agregando un "primer" parece una práctica común. :) Por ejemplo, en Haskell,
reverse :: [a] -> [a]
reverse = reverse'' []
where reverse'' :: [a] -> [a] -> [a]
reverse'' result [] = result
reverse'' result (x:xs) = reverse'' (x:result) xs
Siempre uso do_, como "do_compute" con "compute". Lo encuentro bastante descriptivo, ya que es efectivamente la parte de la función que realiza la acción, mientras que el "cálculo" que se llama necesita tener un nombre descriptivo simple para el mundo exterior.
Tiendo a agregar "_curriculum" hasta el final. Entonces "reverse_recurse". No estoy seguro de dónde lo saqué. Me gusta dejar la función de caso base tan simple como la tienes en tu ejemplo. Tiende a ser la función "pública" y el hecho de que utiliza una función auxiliar para realizar la iteración es irrelevante para la persona que llama. En javascript, a veces llego a ocultar la función iterativa a través de un cierre, para dejar muy claro que no se debe invocar directamente.
configurar y ejecutar
ejemplo:
function whateverSetup() { ... }
function whateverExecute() { ... }
También estoy de acuerdo con ShreevatsaR, en este ejemplo, convertiría al ayudante en una función privada.
Para otros casos en los que necesito que las funciones auxiliares sean visibles en todo el módulo, pero no se exporten, tiendo a prefijar las funciones con ''_''. Claro, existe la declaración de exportación explícita, pero durante el desarrollo tiendo a exportar todas las funciones para facilitar la exploración interactiva, por ejemplo, en ghci. Más tarde agregué la lista de funciones exportadas y la barra inferior hace que sea fácil recordar si pretendía que una función fuera local o no.
Utilizo aux
o foo_aux
(para la función principal foo
) y anido la definición para que no sea visible externamente.