Pourquoi Haskell a-t-il une fonction intégrée if/then/else
, qui dépend du Bool
type, au lieu d'avoir une simple fonction de bibliothèque? Tel que
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Pourquoi Haskell a-t-il une fonction intégrée if/then/else
, qui dépend du Bool
type, au lieu d'avoir une simple fonction de bibliothèque? Tel que
if :: Bool -> a -> a -> a
if True x _ = x
if False _ y = y
Réponses:
Il est uniquement pour le beau sucre du if
, then
et des else
mots - clés; en fait, GHC (avec l' RebindableSyntax
extension activée) désugarera la syntaxe en appelant simplement n'importe quelle ifThenElse
fonction qui est dans la portée.
Cela n'a pas beaucoup d'importance ... pour moi, il semble que / then / else ne soit pas utilisé très souvent de nos jours. Je me retrouve à écrire des gardes de modèle au lieu de si .. alors .. sinon.
D'un point de vue syntaxique, cependant, c'est bien d'avoir
if expr1 then expr2 else expr3
Vous pouvez donc écrire
if foo a then bar b else baz c
au lieu de
if (foo a) (bar b) (baz c)
qui me semble un peu trop LISPish.
Pour l'analyse sémantique et la génération de code, il est agréable d'avoir cette construction, qui peut facilement être compilée en code machine efficace. Notez que le code peut ignorer la partie qui fait le thunk pour la branche qui n'est pas atteinte, par opposition à un appel de fonction, où les paramètres (non évalués) doivent tous être passés. Mais il faut aussi du temps (et de la mémoire, qui doit être récupérée plus tard) pour créer le thunk. Pour remédier à cela, il faudrait intégrer la fonction if partout.