El primero se considera mejor estilo, por 2 razones.
En primer lugar: Mucha gente diría que se ve mejor, ya que no tiene que escribir todo el ==
. Esta es una razón muy subjetiva, por supuesto. También, que normalmente ni siquiera introducir una nueva declaración del caso, pero sólo coincidir con los argumentos de la lista argumento de la función, así:
foo 1 b c = ... -- etc
...
foo _ b c = ... -- for the "otherwise" part
Esto hace que el código aún más compacto y de fácil lectura, que mucha gente le gusta.
En segundo lugar, en realidad hay una diferencia semántica. Imagine que tiene un tipo de datos de esta manera:
data Cake = Apple | Cheese | Cream
Si utiliza el primer método, partido contra los constructores en la expresión case..of
:
case a of
Apple -> "fruit"
_ -> "not fruit"
Sin embargo, si se intenta hacer una vigilado expresión de algún tipo, como esto:
| a == Apple = "fruit"
| otherwise = "not fruit"
... no va a funcionar realmente, porque el tipo Cake
no tiene una instancia Eq
, por lo que no puede usar ==
para comparar dos valores. No siempre es necesario introducir una instancia Eq
(con deriving (Eq)
después de la definición de datos), por lo que no tener que hacerlo en este caso podría ser significativo.
En su primer ejemplo, no debería usar 'de otra manera'. Lo que hace es que introducirá una nueva variable llamada 'otherwise = a', que puede conducir a errores sutiles. Debería hacer '_ -> error" ... "' en su lugar. – dflemstr
@dflemstr gracias por la información y la explicación. – Nomics
Como consejo general en varios idiomas, prefiero escribir subbloques de código en la siguiente línea y siempre con el mismo nivel de sangría. Esto te protege de tener que volver a enhebrar las líneas restantes si la primera cambia de longitud (tal vez debido a que se renombra o algo así) – hugomg