¿Por qué Haskell tiene incorporado "if / then / else" en lugar de definirlo como una función de biblioteca simple?

25

¿Por qué Haskell tiene una función incorporada if/then/else, que depende del Booltipo, en lugar de tener una función de biblioteca simple? Como

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y
Petr Pudlák
fuente
44
Supongo que querían explícitamente la sintaxis if / then / else que no pueden obtener sin las funciones mixfix como lo han hecho en agda. La función a la que se refiere está estructurada como un ternario, que podría implementar usted mismo, aunque supongo que nos dieron azúcar si / luego / más (es probable que solo sea azúcar sobre un caso) solo porque podrían y es inofensivo ... Pero no tengo nada para respaldarme aquí, por eso estoy escribiendo esto en un comentario.
Jimmy Hoffa
10
Esto puede ser obvio para la mayoría de los lectores, pero me gustaría señalar que tener îf / then / else como función no sería una buena solución en un lenguaje entusiasta (por ejemplo, esquema o sml), mientras que es razonable en un vago lenguaje como Haskell.
Giorgio

Respuestas:

24

Es puramente para el azúcar agradable del if, theny elsepalabras clave; de hecho, GHC (con la RebindableSyntaxextensión habilitada) desugará la sintaxis simplemente llamando a cualquier ifThenElsefunción que esté dentro del alcance.

Llama de Ptharien
fuente
6

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.

Ingo
fuente
3
No creo que la alineación sea un problema real. Tengo entendido que GHC ya es excepcionalmente bueno para incluir pequeñas funciones, porque es un patrón tan común en Haskell.
Tikhon Jelvis
1
@TikhonJelvis Claro, pero con if / then / else no necesita una función especial que siempre debe alinearse. Ni siquiera necesita un pase de línea y aún puede generar un código decente. No todo el mundo es GHC.
Ingo