# Funny type.

**Jay Cox
**
sqrtofone@yahoo.com

*Sun, 27 May 2001 22:46:37 -0500*

One day I was playing around with types and I came across this type:
>*data S m a = Nil | Cons a (m (S m a))
*
The idea being one could use generic functions with whatever monad m (of
course
m doesn't need to be a monad but my original idea was to be able to make
mutable lists with some sort of monad m.)
Anyway in attempting to define a generic show instance for the above
datatype I finally came upon:
>*instance (Show a, Show (m (S m a))) => Show (S m a) where
*>* show Nil = "Nil"
*>* show (Cons x y) = "Cons " ++ show x ++ " " ++ show y
*
which boggles my mind. But hugs +98 and ghci
-fallow-undecidable-instances both allow it to compile but when i try
>*show s
*
on
>*s = Cons 3 [Cons 4 [], Cons 5 [Cons 2 [],Cons 3 []]]
*
(btw yes we are "nesting" an arbitrary lists here! however structurally
it really isnt much different from any tree datatype)
we get
ERROR -
*** The type checker has reached the cutoff limit while trying to
*** determine whether:
*** Show (S [] Integer)
*** can be deduced from:
*** ()
*** This may indicate that the problem is undecidable. However,
*** you may still try to increase the cutoff limit using the -c
*** option and then try again. (The current setting is -c998)
funny thing is apparently if you set -c to an odd number (on hugs)
it gives
*** The type checker has reached the cutoff limit while trying to
*** determine whether:
*** Show Integer
*** can be deduced from:
*** ()
why would it try to deduce Show integer?
Anyway, is my instance declaration still a bit mucked up?
Also, could there be a way to give a definition of show for S [] a?
Heres my sample definition just in case anybody is curious.
>*myshow Nil = "Nil"
*>*myshow (Cons x y) = "Cons "++ show x ++
*>* " [" ++ blowup y ++ "]"
*>* where blowup (x:y:ls) = myshow x ++ "," ++ blowup (y:ls)
*>* blowup (x:[]) = myshow x
*>* blowup [] = ""
*
Thanks,
Jay Cox
yet another non-academic person on this list.