2016-07-17 6 views
4

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.

Répondre

5

En général, vous voulez regarder GHC Core. L'option principale pour voir la sortie de base est d'utiliser le -ddump-simpl pour GHC, décrit here. Il y a aussi beaucoup de drapeaux pour modifier cette sortie (pour le rendre plus simple), comme -dsuppress-all.

Informations sur actuellement lecture core peut être trouvé here.