cuando escribo:listas reutilización en los patrones de
sort [x] = [x]
es el compilador suficientemente inteligente como para volver a utilizar la misma lista, o tengo que ser explícitos al respecto?
sort [email protected][_] = xs
cuando escribo:listas reutilización en los patrones de
sort [x] = [x]
es el compilador suficientemente inteligente como para volver a utilizar la misma lista, o tengo que ser explícitos al respecto?
sort [email protected][_] = xs
¿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 No tengo ni idea de lo que estoy viendo aquí, ¡pero parece impresionante! – fredoverflow
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) –