Pourquoi Haskell a-t-il intégré «if / then / else» au lieu de le définir comme une simple fonction de bibliothèque?


25

Pourquoi Haskell a-t-il une fonction intégrée if/then/else, qui dépend du Booltype, 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

4
Je suppose qu'ils voulaient explicitement la syntaxe if / then / else qu'ils ne peuvent pas obtenir sans les fonctions mixfix comme ils l'ont fait dans agda. La fonction à laquelle vous faites référence est structurée comme un ternaire, que vous pouvez implémenter vous-même si je suppose qu'ils nous ont donné du sucre si / alors / sinon (c'est probablement juste du sucre sur une affaire) simplement parce qu'ils le pourraient et que c'est inoffensif .. Mais je n'ai rien pour me soutenir ici, c'est pourquoi j'écris ceci dans un commentaire.
Jimmy Hoffa

10
Cela pourrait être évident pour la plupart des lecteurs, mais je tiens à souligner que le fait d'avoir îf / then / else comme fonction ne serait pas une bonne solution dans un langage passionné (par exemple, schéma ou sml) alors qu'il est raisonnable dans un paresseux langue comme Haskell.
Giorgio du

Réponses:


24

Il est uniquement pour le beau sucre du if, thenet des elsemots - clés; en fait, GHC (avec l' RebindableSyntaxextension activée) désugarera la syntaxe en appelant simplement n'importe quelle ifThenElsefonction qui est dans la portée.


6

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.


3
Je ne pense pas que l'inline soit un problème réel. Je crois comprendre que GHC est déjà exceptionnellement bon pour intégrer de petites fonctions, car c'est juste un modèle si commun dans Haskell.
Tikhon Jelvis

1
@TikhonJelvis Bien sûr, mais avec if / then / else vous n'avez pas besoin d'une fonction spéciale qui doit toujours être alignée. Vous n'avez même pas besoin d'un pass en ligne et vous pouvez toujours générer du code décent. Tout le monde n'est pas GHC.
Ingo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.