¿Cuándo se evalúa mi expresión de Haskell?
Si yo defino
λ> data Bar = Bar Int deriving Show
λ> data Foo = Foo Bar deriving Show
y
λ> let foo = trace "foo" Foo (trace "bar" Bar 100)
λ> let two = trace "two" 2
λ> let g (Foo x) y = y
entonces creo que entiendo por qué me sale
λ> g foo two
foo
two
2
Pero si luego repito esto, me sale
λ> g foo two
two
2
y no entiendo por quéfoo
parece no haber sido evaluado para la segunda invocación deg
, especialmente porque claramente no está (todavía) de alguna manera ya disponible, como puedo verificar con
λ> foo
Foo bar
(Bar 100)
aunque, de nuevo, para mi confusión, repetir lo anterior da
λ> foo
Foo (Bar 100)
¿Por qué mifoo
¿la expresión parece estar ya evaluada en algunos casos y no evaluada en otros? Y para el caso, ¿por qué mitwo
expresiónsiempre necesita ser evaluado?