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