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.
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.
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.
Réponses:
Il est uniquement pour le beau sucre du
if
,then
et deselse
mots - clés; en fait, GHC (avec l'RebindableSyntax
extension activée) désugarera la syntaxe en appelant simplement n'importe quelleifThenElse
fonction qui est dans la portée.la source
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
Vous pouvez donc écrire
au lieu de
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.
la source