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

25

Perché Haskell ha un if/then/else incorporato, che dipende dal tipo Bool , invece di avere una semplice funzione di libreria? Ad esempio

if :: Bool -> a -> a -> a
if True  x _ = x
if False _ y = y
    
posta Petr Pudlák 22.04.2013 - 14:14
fonte

2 risposte

23

È puramente per lo zucchero buono delle parole if , then e else ; infatti, GHC (con l'estensione RebindableSyntax abilitata) desugar la sintassi semplicemente chiamando qualunque funzione ifThenElse è in ambito.

    
risposta data 22.04.2013 - 17:51
fonte
5

Non importa molto ... per me sembra che se / then / else non venga usato molto spesso al giorno d'oggi. Mi trovo a scrivere pattern guards instad di if .. then .. else.

Da un punto di vista sintattico, tuttavia, è bello avere

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 sembra un po 'troppo LISPish per me.

Per l'analisi semantica e la generazione di codice, è bello avere questo costrutto, che può essere facilmente compilato con 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 devono passare tutti i parametri (non valutati). Ma costa anche tempo (e la memoria, che deve essere recuperata in seguito) per creare il thunk. Per ovviare a questo, si dovrebbe inline la funzione if ovunque.

    
risposta data 24.04.2013 - 19:00
fonte

Leggi altre domande sui tag