instance Show (Thrist (a ~> b)) where ...... and ran against several walls. The short story is: Forget it!
The long story comes next, if you are interested.
First of all, what do we want? In my paper I define a nice thrist
[('A', 33), (65, 'a')]l :: Thrist (,) Char Charand the Ωmega interpreter readily prints it. I wanted to do the same in Haskell too, as a pretty extension of my thrist package. I started like this:
instance Show (a ~> b) => Show (Thrist (~>) a b)I even managed to show singleton thrists (which hold just one element).
show Nil = "l"
But the first obstacle was immediate: When the thrist has more than one element the hidden existential type appears, but the compiler does not know that this (a ~> x) has a Show instance!
So I hoped to extend the context to require Show (forall a b . a ~> b) that is I want all saturations of the type constructor (~>) to be Showable. But GHC does not like this syntax...
At his point I started some fundamental thinking...
Since the type of the thrist only reveals the beginning and the end, there may be arbitrary non-showable types hidden inside, even if the resulting type conveys the illusion of Showability. To wit:
[(5, id), (id, 42)]l :: Thrist (,) Int IntWe can enter such a thing, but there is no hope to show it :-(
So what are our remaining options? Ganesh has brought Show2 to my attention, I might look at it soon, but it won't solve the above problem.
We can say goodbye to (,) and define something like:
newtype Pair a b = (Show a, Show b) => Pair (a, b)There is some hope that Thrist Pair a b can be declared as a Show2 instance.
PS: Ωmega cheats, of course. It frobs the Show functionality of the underlying Haskell implementation. It also prints functions as <fn>.