A menudo las definiciones en las cláusulas where
son para evitar repetirse si una sub-expresión aparece más de una vez en una definición. En tal caso, el programador piensa en la definición local como un simple sustituto para escribir las subexpresiones en línea. Por lo general, no escribiría explícitamente las subexpresiones en línea, por lo que tampoco debe escribir la definición where
. Si lo está haciendo para ahorrar en tipeo, entonces la declaración tipo mataría todos sus ahorros.
Parece bastante común introducir where
a los alumnos de Haskell con ejemplos de esa forma, por lo que siguen pensando que "estilo normal" es no dar declaraciones de tipo para las definiciones locales. Al menos, esa fue mi experiencia aprendiendo Haskell. Desde entonces, descubrí que muchas de mis funciones que son lo suficientemente complicadas como para necesitar un bloque where
se vuelven bastante inescrutables si no conozco el tipo de definiciones locales, así que trato de equivocarme para escribirlas siempre; incluso si creo que el tipo es obvio mientras escribo el código, puede que no sea tan obvio cuando lo estoy leyendo después de no haberlo mirado por un tiempo. Un poco de esfuerzo para mis dedos casi siempre se ve compensado por incluso uno o dos casos de tener que ejecutar inferencias tipo en mi cabeza.
respuesta de Ingo da una buena razón para deliberadamente no dar un tipo a una definición local, pero sospecho que la razón principal es que muchos programadores han asimilado la regla de oro prever que las declaraciones de tipo para los mejores definiciones de los niveles, pero no para las definiciones locales de la forma en que aprendieron Haskell.
No puedo responder la pregunta de si hará que la compilación sea más rápida, pero siempre es una buena práctica escribir firmas de tipo si se trata de una función no trivial. – Wes
Además, muchas de estas definiciones locales necesitan acceder a las variables de tipo del ámbito externo, lo que tiende a saturar el código con 'asTypeOf' y amigos, a menos que use' ScopedTypeVariables'. – Vitus
Si su función es lo suficientemente importante como para obtener una declaración de tipo, ¿por qué no convertirla en un ciudadano de primera clase? – rotskoff