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