2011-03-06 50 views

回答

10

它足够聪明吗?让我们来看看!

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

这里是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] 

感兴趣的是这一行:

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

在这里我们看到,我们正在创造一个新的利弊细胞为x_sdV[]。所以不行。但是,这并不算太坏,因为x_sdV本身是共享的,所以它只是一个构造函数;此外,我们迫使名单xs的脊柱,因此无论如何GHC将需要重写它。所以不要担心。

+1

+1我完全不知道我在这里看到什么,但它确实看起来令人印象深刻! – fredoverflow 2011-03-06 17:12:48

+0

是的,STG读起来有点有趣。 :表示cons,[x1 x2 x3]表示cons的参数(有两个,因为cons有两个参数。) – 2011-03-06 17:49:57