# Variance Checking for type parameters

I’m trying to understand the discussion of variance checking from Odersky, Martin; Spoon, Lex; Venners, Bill. Programming in Scala: A Comprehensive Step-by-Step Guide, Third Edition (Kindle Locations 11024-11038). Artima Press. Kindle Edition. (19.5). They give the following example.

As a somewhat contrived example, consider the following class definition, where several positions are annotated with their classifications, ^ + (for positive) or ^- (for negative):

abstract class Cat[-T, + U] {
def meow[ W ^-]( volume: T ^-, listener: Cat[ U ^ +, T ^-] ^-) : Cat[ Cat[ U ^ +, T ^-] ^-, U ^ +] ^ +
}

The positions of the type parameter, W, and the two value parameters, volume and listener, are all negative. Looking at the result type of meow, the position of the first Cat[ U, T] argument is negative because Cat’s first type parameter, T, is annotated with a -. The type U inside this argument is again in positive position (two flips), whereas the type T inside that argument is still in negative position.

I understand the rules for function types (“require less, supply more”) but I don’t have any intuition for why the type parameter W for “meow” is a “negative position” and what that even means. I’d be grateful for an explanation or a pointer to a more complete discussion

After thinking harder about it I guess this does make sense: The negative variance on W is just part of the “requiring less” condition.