Mon Jan 2 08:11:48 EST 2012


To move forward I need a systematically different approach.  I don't
think the problem is correctness -- though that is still possible
because I can't explain some of the error messages where the order of
type constructors is flipped.

The problem is really not understanding where the error originates.
How to "query" a type?

I had used this before to equate types:

  typeEq :: (Monad m) => t -> t -> m ()
  typeEq _ _ = return ()

In a monad it's simple to insert a "statement" like that without
affecting anything else.

What about using this trick and add an extra argument to a function
that's only used in conjunction with a variable that I want to know
the type of.  I.e.

  expr test = do ...
     typeEq somevar test