
*Main> :t rollDie ~>> (rollDie ~>> rollDie) rollDie ~>> (rollDie ~>> rollDie) :: Seed -> (Int, Seed)
This is a function. How exactly do you want ghci to show it? When you figure that out, feel free to make an instance of Show for it.
Just because user programs can't show function internals (they can show parts of in/out tables, and with sufficient overloading they can even show approximations of representation) that does not mean that the language implementation can't show function internals. That is a feature that I've always missed in Haskell implementations. In the reduction systems I used before Haskell, one could enter a function, reduce it (stepwise, or to whnf, or even to hnf) and get the resulting function back in the editor, ready for inspection, editing, application, and further reduction. That kind of feature needs to be designed into the implementation early on, but it gives a whole new dimension to "programming with functions" (I recall how difficult it was for the designers and implementers of those reduction systems to explain that difference to reviewers). Claus PS. and, yes, before anyone suspects otherwise, those reduction systems did compiled graph reduction - they just didn't expose users to all those low-level details.