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.