¿Por qué Haskell tiene una función incorporada if/then/else
, que depende del Bool
tipo, en lugar de tener una función de biblioteca simple? Como
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
¿Por qué Haskell tiene una función incorporada if/then/else
, que depende del Bool
tipo, en lugar de tener una función de biblioteca simple? Como
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Respuestas:
Es puramente para el azúcar agradable del if
, then
y else
palabras clave; de hecho, GHC (con la RebindableSyntax
extensión habilitada) desugará la sintaxis simplemente llamando a cualquier ifThenElse
función que esté dentro del alcance.
No importa mucho ... para mí parece que / luego / más no se usa muy a menudo hoy en día. Me encuentro escribiendo guardias de patrones en lugar de if .. then .. else.
Sin embargo, desde un punto de vista sintáctico, es bueno tener
if expr1 then expr2 else expr3
Entonces puedes escribir
if foo a then bar b else baz c
en lugar de
if (foo a) (bar b) (baz c)
lo cual me parece un poco LISPish.
Para el análisis semántico y la generación de código, es bueno tener esta construcción, que puede compilarse fácilmente en un código de máquina eficiente. Tenga en cuenta que el código puede omitir la parte que hace que la rama no se alcance, en lugar de una llamada a la función, donde se deben pasar todos los parámetros (no evaluados). Pero también cuesta tiempo (y memoria, que debe recuperarse más tarde) para crear el thunk. Para cumplir con esto, uno tendría que incluir la función if en todas partes.