
Without actually addressing the question, here are some rules of thumb I use for identifying and choosing type variables: a - whatever. Usually return type, thing inside functor, etc. If you need more than one, you can use b/c. m - usually monad, sometimes just applicative. Can use n if you need more. s - state or state token f - usually functor or more. Can use t if you need more. e - error i - Index r/o - "Result" or "Output" with no real consistency on typeclass constraints. k/v - Key/Value w - result monoid These are by no means particularly hard and fast rules, but they're the first things I jump to when I see a type variable. I do try to use more descriptive names if I don't think it will be fairly obvious from context. --Will
On Aug 10, 2017, at 4:29 PM, Jeffrey Brown
wrote: 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.