2016-07-17 22 views
4

Abschnitt 2.3.1.1 "Ein Hinweis auf Fusion" von Haskell Wiki's Numeric Haskell page erklärt Schleife Fusion durch den optimierten Code zeigt, wie in dem folgenden:Wie das Ergebnis der Schleifenfusion in Haskell dump?

Vor der Optimierung:

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)) 

Nach der Optimierung:

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))) 
    } 

Ich bin gespannt, wie ich den optimierten Code so sehen kann. Der Artikel erwähnte ghc-core Werkzeug, aber zeigte den spezifischen Befehl nicht.

Antwort

5

Im Allgemeinen möchten Sie GHC Core betrachten. Die primäre Option zum Anzeigen der Kernausgabe ist die Verwendung des -ddump-simpl für GHC, beschrieben in here. Es gibt auch viele Flags, um diese Ausgabe zu modifizieren (um es einfacher zu machen), wie -dsuppress-all.

Informationen über tatsächlich lesen Kern kann here gefunden werden.