2011-03-06 4 views

Respuesta

10

¿Es lo suficientemente inteligente? ¡Veamos!

[email protected]:~$ cat Foo.hs 
module Foo where 
foo [x] = [x] 

Aquí es el STG:

[email protected]:~$ ghc --make Foo.hs -ddump-stg -fforce-recomp 
[1 of 1] Compiling Foo    (Foo.hs, Foo.o) 

==================== STG syntax: ==================== 
Foo.foo = 
    \r srt:(0,*bitmap*) [ds_sdP] 
     let-no-escape { 
      fail_sdO = 
       sat-only \r srt:(0,*bitmap*) [ds1_sdN] 
        Control.Exception.Base.patError "Foo.hs:2:0-12|function foo"; 
     } in 
      case ds_sdP of wild_sdY { 
      [] -> fail_sdO GHC.Prim.realWorld#; 
      : x_sdV ds1_sdT -> 
       case ds1_sdT of wild1_sdZ { 
        [] -> : [x_sdV GHC.Types.[]]; 
        : ipv_se0 ipv1_se1 -> fail_sdO GHC.Prim.realWorld#; 
       }; 
      }; 
SRT(Foo.foo): [Control.Exception.Base.patError] 

La parte interesante es esta línea:

    [] -> : [x_sdV GHC.Types.[]]; 

donde vemos que estamos creando una nueva cons cell para x_sdV y []. Entonces, no. Sin embargo, esto no es tan malo, porque x_sdV se comparte, por lo que es solo un constructor; además, estamos forzando el lomo de la lista xs, por lo que GHC tendría que volver a escribir de todos modos. Entonces no te preocupes por eso

+1

+1 No tengo ni idea de lo que estoy viendo aquí, ¡pero parece impresionante! – fredoverflow

+0

Sí, STG es un poco divertido de leer. : indica contras, y [x1 x2 x3] indica los argumentos a contras (hay dos, ya que los contras toman dos argumentos) –

Cuestiones relacionadas