3 votes

Comment fonctionne la fusion de flux dans Haskell ?

Puis-je écrire ma propre fonction map soumise à la fusion de flux en Haskell ?

Pourquoi l'itération récursive sur une liste n'est-elle pas soumise à la fusion ? Cela tue complètement l'expressivité du pattern matching de Haskell : foo (x:xx) ... !

Les fonctions de boucle Prelude sont-elles fusionnées ?

1voto

Christof Schramm Points 148

La fusion de flux en Haskell est réalisée à l'aide de règles de réécriture. (voir la documentation ghc pour plus d'informations) . Il s'agit de règles que vous pouvez spécifier dans le code à l'aide de la fonction RULES pragma.

L'idée de base des règles de réécriture est de spécifier un ensemble de façons dont le code peut être réécrit au moment de la compilation, par exemple si vous définissez votre propre version de map como map' vous pourriez faire quelque chose comme

{-# RULES 
   "map'/map'" forall f g xs. map' f (map' g xs) = map' (f . g) xs
  #-}

Cela introduit une règle de réécriture appelée map'/map' . Cette règle aurait pour effet de réécrire toutes les correspondances d'une fonction f sur une liste qui est à son tour un g cartographié sur un certain nombre de xs en une seule cartographie de (f . g) sur ces x.

L'utilisation des règles de réécriture comporte un certain nombre d'autres sous-types. Par exemple, vous pouvez spécifier à quelle phase du compilateur une règle est appliquée, et le compilateur n'a aucun moyen de vérifier si ces règles sont correctes.

Les résultats de la réécriture sont toujours vérifiés, mais si vous avez fait quelque chose d'incorrect sur le plan sémantique dans une règle de réécriture, c'est votre faute.

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