Perché Haskell ha incorporato "if / then / else" invece di definirlo come una semplice funzione di libreria?


25

Perché Haskell ha un built-in if/then/else, che dipende dal Booltipo, invece di avere una semplice funzione di libreria? Ad esempio

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y

4
Immagino che volessero esplicitamente la sintassi if / then / else che non possono ottenere senza le funzioni mixfix come hanno in agda. La funzione a cui ti riferisci è strutturata come un ternario, che potresti implementare anche se presumo che ci abbiano dato se / allora / altrimenti zucchero (è probabilmente solo zucchero su un caso) solo perché potevano ed è innocuo .. Ma non ho nulla per supportarmi qui, motivo per cui sto scrivendo questo in un commento.
Jimmy Hoffa,

10
Questo potrebbe essere ovvio per la maggior parte dei lettori, ma vorrei sottolineare che avere îf / then / else come funzione non sarebbe una buona soluzione in un linguaggio desideroso (ad esempio schema o sml) mentre è ragionevole in un pigro linguaggio come Haskell.
Giorgio,

Risposte:


24

E 'puramente per la bella di zucchero del if, thene elsele parole chiave; infatti, GHC (con l' RebindableSyntaxestensione abilitata) eliminerà la sintassi semplicemente chiamando qualunque ifThenElsefunzione sia nell'ambito.


6

Non importa molto ... per me sembra che / allora / altrimenti non sia usato molto spesso al giorno d'oggi. Mi ritrovo a scrivere guardie di schemi instad di if .. then .. else.

Da un punto di vista sintattico, però, è bello averlo

if expr1 then expr2 else expr3

Quindi puoi scrivere

if foo a then bar b else baz c

invece di

if (foo a) (bar b) (baz c)

che mi sembra un po 'troppo LISPish.

Per l'analisi semantica e la generazione di codice, è bello avere questo costrutto, che può essere facilmente compilato in un codice macchina efficiente. Si noti che il codice può saltare la parte che crea il thunk per il ramo che non viene raggiunto, al contrario di una chiamata di funzione, in cui tutti i parametri (non valutati) devono essere passati. Ma costa anche tempo (e memoria, che devono essere recuperati in seguito) per creare il thunk. Per ovviare a questo, si dovrebbe incorporare la funzione if ovunque.


3
Non credo che l'allineamento sia un vero problema. La mia comprensione è che GHC è già eccezionalmente bravo a integrare piccole funzioni, perché è un modello così comune in Haskell.
Tikhon Jelvis,

1
@TikhonJelvis Certo, ma con if / then / else non hai bisogno di una funzione speciale che deve sempre essere allineata. Non hai nemmeno bisogno di un passaggio in linea e puoi comunque generare un codice decente. Non tutto il mondo è GHC.
Ingo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.