Section 2.3.1.1 "Une note sur la fusion" de Haskell Wiki's Numeric Haskell page explique la fusion de la boucle en montrant le code optimisé dans les domaines suivants:Comment vider le résultat de la fusion de boucle dans Haskell?
Avant optimisation:
import qualified Data.Vector as V
test :: V.Vector Int -> Double
test = V.foldl (\ a b -> a * sqrt (fromIntegral b)) 0
create :: Int -> V.Vector Int
create n = (V.enumFromTo 1 n)
main = print (test (create 1000000))
Après optimisation:
main_$s$wfoldlM_loop :: Int# -> Double# -> Double#
main_$s$wfoldlM_loop =
\ (sc_sWA :: Int#) (sc1_sWB :: Double#) ->
case <=# sc_sWA 1000000 of _ {
False -> sc1_sWB;
True ->
main_$s$wfoldlM_loop
(+# sc_sWA 1)
(*##
sc1_sWB (sqrtDouble# (int2Double# sc_sWA)))
}
Je suis curieux de savoir comment je peux voir le code optimisé comme celui-ci. L'article mentionné ghc-core outil, mais n'a pas montré la commande spécifique.