data Contador = Cero
| Incrementar Contador
deriving Show
es_cero :: Contador -> Bool
decrementar :: Contador -> Contador -- se aplica a contadores no nulos
es_cero Cero = True
es_cero (Incrementar c) = False
decrementar (Incrementar c) = c
-- Ejemplos
contadores :: [Contador]
contadores = Cero : map Incrementar contadores
cero = Cero
uno = Incrementar cero
dos = Incrementar uno
tres = Incrementar dos
cuatro = Incrementar tres
-- Prototipo del chequeador de balanceo
balanceo :: String -> Bool
balanceo s = balanceo_rec s Cero
balanceo_rec :: String -> Contador -> Bool
balanceo_rec [] c = es_cero c
balanceo_rec (a:as) c =
if a == '('
then balanceo_rec as (Incrementar c)
else if a == ')'
then (not (es_cero c)) && (balanceo_rec as (decrementar c))
else balanceo_rec as c