haskell - sirve - triangulo de pascal hasta el 20
¿Cuánto del triángulo de Pascal evalúa esto? (1)
Sí, solo se evalúan los elementos necesarios para calcular el elemento en cuestión.
GHCi ofrece los comandos :sprint
y :print
debugging que pueden proporcionarle información sobre qué partes de un valor ya se han evaluado.
En este ejemplo:
GHCi> :sprint pascal
pascal = _
(Esto se debe a que no se ha evaluado nada en este momento y los thunks se muestran como _
).
GHCi> pascal !! 5 !! 5
1
(No estoy usando 50
porque este ejemplo sería demasiado largo).
GHCi> :sprint pascal
pascal = [1] : [_,1] : [_,_,1] : [_,_,_,1] : [_,_,_,_,1] :
(_ : _ : _ : _ : _ : 1 : _) : _
Ahora tienes una idea bastante clara de qué partes se han examinado.
Probemos uno más:
GHCi> pascal !! 5 !! 4
5
GHCi> :sprint pascal
pascal = [1] : [1,1] : [_,2,1] : [_,_,3,1] : [_,_,_,4,1] :
(_ : _ : _ : _ : 5 : 1 : _) : _
Y otro:
GHCi> pascal !! 10 !! 5
252
GHCi> :sprint pascal
pascal = [1] : [1,1] : [1,2,1] : [1,3,3,1] : [1,4,6,4,1] :
(1 : 5 : 10 : 10 : 5 : 1 : _) :
(_ : 6 : 15 : 20 : 15 : 6 : _) :
(_ : _ : 21 : 35 : 35 : 21 : _) :
(_ : _ : _ : 56 : 70 : 56 : _) :
(_ : _ : _ : _ : 126 : 126 : _) :
(_ : _ : _ : _ : _ : 252 : _) : _
Si tengo esta constante pascal
definida como
pascal :: [[Int]]
pascal = iterate newrow [1]
where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0])
Y evalúo pascal !! 50 !! 50
pascal !! 50 !! 50
pascal !! 50 !! 50
en GHCI, ¿cuánto del triángulo evalúa esto? ¿Esa pereza significa que solo se calculan los valores necesarios (más un montón de thunks)?