Hola,
Pego el código:
data T = N | C T T
baz f k N = [ ]
baz f k (C t N ) = f (baz f (k + 1) t)
baz f k (C t u) = k : baz f (k + 1) u
tree = C N (C tree N )
Si miran las ecuaciones pueden ver que en algunos casos el k se agrega a la lista y en otros no.
Ahora sigamos la secuencia de evaluación de (take 3 $ baz id 0 tree)
(me voy a saltear algunos pasos de cuentas simples)
take 3 $ baz id 0 tree == *def de tree*
take 3 $ baz id 0 (C N (C tree N )) == *ahora puedo reducir la aplicación de baz, tercera ecuación*
take 3 $ 0 : baz id 1 (C tree N ) == *ahora puedo reducir la aplicación de take*
0 : take 2 $ baz id 1 (C tree N ) == *ahora puedo reducir la aplicación de baz, segunda ecuación*
0 : take 2 $ id (baz id 2 tree) == *id*
0 : take 2 $ baz id 2 tree == *def de tree*
0 : take 2 $ baz id 2 (C N (C tree N )) == *ahora puedo reducir la aplicación de baz, tercera ecuación*
0 : take 2 $ 2 : baz id 3 (C tree N ) == *ahora puedo reducir la aplicación de take*
0 : 2 : take 1 $ baz id 3 (C tree N ) == *ahora puedo reducir la aplicación de baz, segunda ecuación*
0 : 2 : take 1 $ id (baz id 4 tree) == *id*
0 : 2 : take 1 $ baz id 4 tree == *def de tree*
0 : 2 : take 1 $ baz id 4 (C N (C tree N )) == *ahora puedo reducir la aplicación de baz, tercera ecuación*
0 : 2 : take 1 $ 4 : baz id 5 (C tree N ) == *ahora puedo reducir la aplicación de take*
0 : 2 : 4 : take 0 $ baz id 5 (C tree N ) == *ahora puedo reducir la aplicación de take*
0 : 2 : 4 : []
Espero haya quedado más claro.
saludos