4 votes

Pourquoi ( !!) et (.) ont-ils la même priorité 9 ?

Je suis novice en Haskell et j'ai rencontré une erreur simple sur ce morceau d'expression.

matches !! length . count

On ne peut pas mélanger ' ! [infixl 9] et "." [infixr 9] dans la même expression infixe.

Cela m'a surpris - pourquoi ces opérateurs partagent-ils une précendance ? Qu'est-ce qui a empêché les concepteurs de Haskell d'établir (.) à une précendance plus élevée que (!!) ?

Je ne peux pas imaginer que cela ait été simplement négligé, donc je suppose qu'il y a une logique ici que je manque.

Nota Je réalise qu'appliquer (!!) à la fonction qui est composée par (.) entraînerait toujours une erreur au moment de la compilation. Je suis curieux de savoir pourquoi Haskell a été conçu d'une manière qui permet ce message d'erreur inattendu.

11voto

OmnipotentEntity Points 7083

Je suis allé creuser. Il n'y a probablement pas de rime ou de raison pour que les deux opérateurs infixes aient la même précédence. Dans le rapport Haskell 1.0, publié en 1990, l'opérateur (!!) a été trouvé dans le fichier PreludeList.hs et l'opérateur (.) était dans le fichier Prelude.hs. Comme ils traitent de choses complètement différentes (composition de fonctions vs indexation de listes), et qu'ils se trouvaient dans des fichiers complètement différents, il est très probable qu'ils n'ont pas fait l'objet d'une coordination croisée.

De plus, dans le rapport, ces fonctions du prélude sont à peine mentionnées. (.) vient d'être mentionné en une seule ligne comme fonction de composition et (!!) n'était pas du tout mentionné en dehors du fichier source.

La raison de cette situation devrait être plus ou moins évidente. Le Prelude est utile, mais ce n'est pas la raison pour laquelle Haskell a été développé, et ce n'est pas la partie difficile et intéressante de la conception d'un langage. Haskell concernait davantage le lambda calculus et la théorie des catégories que l'indexation des listes. Il n'est donc pas surprenant qu'il n'y ait pas eu beaucoup de réflexion (ou du moins pas beaucoup de documentation !) sur la précédence exacte des différents opérateurs.

8voto

Alec Points 23780

Haskell a beaucoup d'opérateurs. Exécution de

grep -hor '^infix[lr]\{0,1\} .*$' ghc/libraries/ | sort -u

dans ma tête GHC, je récupère 137 opérateurs. Ils ne sont pas tous exposés, mais quand même : puisque la priorité doit être entre 0 y 9 inclusive, les affrontements sont inévitables.

  • $ devrait être plus bas que presque tout (fixité 0)
  • >>= devrait être supérieure à $ (fixité 1)
  • || devrait être supérieure à >>= (fixité 2)
  • && devrait être supérieure à || (fixité 3)
  • == devrait être supérieure à && (fixité 4)
  • ++ devrait être supérieure à == (fixité 5)
  • + devrait être supérieure à ++ (fixité 6)
  • * devrait être supérieure à + (fixité 7)
  • ^ devrait être supérieure à * (fixité 8)
  • !! devrait être supérieure à ^ (fixité 9)
  • . devrait être plus élevé que presque tout (fixité 9)

Donc, il n'y a pas vraiment de place pour différencier la préséance de !! y . . De plus, je ne pense pas qu'il y ait beaucoup de précédents pour l'un ou l'autre . o !! sont censés avoir une plus grande priorité.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X