Counting Constructors

Jay Cox sqrtofone@yahoo.com
Wed, 18 Jul 2001 11:59:46 -0500


> From: Tobias Haeberlein <T.Haeberlein@gmx.de>
> To: haskell@haskell.org
> Subject: Counting Constructors
> 
> I want a show - instance for that type:
>         data Bind a = Zero | Succ a
> resp. for the types (Bind ( ... (Bind a)...))
> 
> showing the following:
> 
>         show (Succ ( ... (Succ Zero)..))  =  n
>                 (where n is the number of Succ's)
> and
> 
>         show (Succ ( ... (Succ x)..)) = show x
>                 (when x != Zero)

that doesnt make sense.  You want n to be some some integral type and
show x 
is a string.

> 
> Does anyone know, how to define those functions in haskell/hugs ??
> (Are they defineable at all?)

sounds like you really want something like
data Bind a = Zero (Maybe a) | Succ (Bind a)

instance (Show a) => Show (Bind a) where
 show x = z 0 x 
   where
    z count (Zero Nothing)  = show count
    z _ (Zero (Just x))     = show x
    z count (Succ x)        = z (count+1) x


Main> let {x :: Bind String; x = Succ $ Succ $ Succ $ Zero Nothing} in
show x
"3"
Main> show (Succ $ Succ $ Zero (Just "Funky"))
"\"Funky\""

However just because you can do it doesnt mean you should.  Personally,
I would think
data Bind a = Something Int (Maybe a)
or
even using the Either datatype in a similar fashion could be more useful
(and has a very trivial show instance which would meet your
requirements).Meh, I'm probably doing somebody's homework here anyway.

Jay