Dadas las siguientes definiciones:
data A = A [A] | V Int | U A
copia :: A → (A,Int)
copia (U a) = let (a', n) = copia a in (U a', n)
copia (V i) = (V i, 1)
copia (A as) = let ps = map copia as
(a, n) = head ps
ts = tail ps
in (A (a : map fst ts), sum (map snd ps))
La respuesta correcta es:
Dado t de tipo A, snd (copia t) siempre retorna un entero no negativo.
Pero no entiendo, porque si t = (U a) entonces snd (copia (U a)) = n, donde n es calculado como copia a.
Pero a puede volver a ser de la forma (U a), cayendo en una recursión que nunca termina.
Alguien me puede dar una mano?