So, yesterday I tried to implement

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 Char

and 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)

show Nil = "[]l"

I even managed to show singleton thrists (which hold just one element).

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 Int

We 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.

Who knows?

PS: Ωmega cheats, of course. It frobs the

Show functionality of the underlying Haskell implementation. It also prints functions as

<fn>.