Haskellers tend to use uninformative single-letter type variables. A case in point:

    Megaparsec> :i ParsecT                                                         
    type role ParsecT nominal nominal representational representational
    newtype ParsecT e s (m :: * -> *) a ...

I've gotten used to the conventions that "a" stands for anything and "m" stands for monad -- but without digging into the code it wasn't initially obvious to me whether "s" stood for stream or state.

Single-letter type variables don't seem to always be the standard, though:
    
    Megaparsec> :i between
    between :: Applicative m => m open -> m close -> m a -> m a
            -- Defined in ‘Control.Applicative.Combinators’

My questions are: (1) Are the brevity gains worth the confusion costs? (2) If I'm looking at a new library for the first time and trying to figure out what a type variable stands for, is there a canonical way to do it? Flailing through documentation at random? Unifying types by hand?

--
Jeff Brown | Jeffrey Benjamin Brown
Website   |   Facebook   |   LinkedIn(spammy, so I often miss messages here)   |   Github